我有两个彼此相关的模型,RequestMatcher
和Response
。 RequestMatcher
有许多Responses
但只有一个activeResponse
。我如何观察activeResponse
模型上的RequestMatcher
,以便我可以在模板中使用它?这就是我所拥有的。
// request-matcher.js
import DS from 'ember-data';
export default DS.Model.extend({
path: DS.attr('string'),
project: DS.belongsTo('project', {async: true}),
responses: DS.hasMany('response', {inverse: 'requestMatcher', async: true}),
activeResponse: DS.attr('number'),
matches_get_request: DS.attr(),
matches_post_request: DS.attr(),
matches_put_request: DS.attr(),
matches_delete_request: DS.attr()
});
和
//response.js
import DS from 'ember-data';
export default DS.Model.extend({
title: DS.attr('string'),
body: DS.attr('string'),
status_code: DS.attr('number'),
requestMatcher: DS.belongsTo('requestMatcher', {async: true}),
isActiveResponse: function() {
if (this.get('isNew')) {
return false;
}
var id = parseInt(this.get('id'));
return this.get('requestMatcher').then(function (requestMatcher) {
if (!requestMatcher) {
return false;
}
var activeResponseId = requestMatcher.get('activeResponse');
return activeResponseId === id;
});
}.property('requestMatcher.activeResponse')
});
我使用的数字为activeResponse
,因为在同一模型上,ember无法两次引用相同的模型类型。我无法让.property()在我的Response
模型上正常工作。它总是呈现为true
。我也试过这种方法,但观察者永远不会被触发。
//request-matcher.js
import DS from 'ember-data';
import Ember from 'ember';
export default DS.Model.extend({
path: DS.attr('string'),
project: DS.belongsTo('project', {async: true}),
responses: DS.hasMany('response', {inverse: 'requestMatcher', async: true}),
activeResponse: DS.attr('number'),
matches_get_request: DS.attr(),
matches_post_request: DS.attr(),
matches_put_request: DS.attr(),
matches_delete_request: DS.attr(),
onActiveResponseChange: function() {
Ember.run.once(this, 'setActiveResponse');
}.observes('activeResponse', 'isLoaded'),
setActiveResponse: function() {
var activeResponseId = parseInt(this.get('activeResponse'));
this.get('responses').then(function (responses) {
responses.forEach(function (response) {
var isActive = activeResponseId === parseInt(response.get('id'));
response.set('isActiveResponse', isActive);
});
});
}
});
答案 0 :(得分:0)
我使用数字作为activeResponse,因为ember在同一模型上两次引用相同模型类型时遇到问题。
这就是你的问题所在。这绝对应该是一种关系,而不是一个数字。我之前在Ember-Data中已经实现了类似于非常的东西,所以除非他们在新的测试版中做出了重大改变,否则你应该能够完成它。以下是我个人宣布这些关系的方式:
export default DS.Model.extend({
responses: DS.hasMany('response', { inverse: 'requestMatcher', async: true }),
activeResponse: DS.belongsTo('response', { inverse: null, async: true })
});
将inverse
设置为null
可以确保您的Response
课程不必了解这种关系(无论如何它似乎都不需要) )。现在,您可以像使用任何其他关系一样使用Ember-Data,只有您不必更改Response
模型中的任何内容。这应该允许您像往常一样观察activeResponse
属性。