观察emberjs中的相关模型属性

时间:2014-07-15 03:23:01

标签: ember.js ember-data

我有两个彼此相关的模型,RequestMatcherResponseRequestMatcher有许多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);
            });
        });   
    }
});

1 个答案:

答案 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属性。