计算模型属性中的Ember错误

时间:2014-08-16 06:29:11

标签: javascript ember.js ember-data

我为用户提供了以下Ember模型,其中包含权限列表:

App.User = DS.Model.extend({
    username: DS.attr(),
    permissions: DS.attr(), //e.g. ['edit', 'read']

    isEditor: function() {
        var perms = this.get('permissions');
        return perms.indexOf('edit') > -1;
    }.property('permissions')
});

除此之外,我还使用它来获取控制器中的编辑器列表(用于select)。当我加载页面时,我在控制台中收到此错误:

Error: Something you did caused a view to re-render after it rendered but before it was inserted into the DOM.

在添加isEditor函数之后发生了,并且如果我注释掉函数的内容它工作正常,尽管显然我从它生成的列表是不正确的。但据我所知,代码没有任何问题。

修改:我在控制器mixin中使用该功能:

App.EditorsMixin = Ember.Mixin.create({
    editors: function() {
        return this.store.filter('user', function(model) {
            return model.get('isEditor');
        });
    }.property()
});

编辑2:似乎问题可能与调用store.find('user')时并非所有editors承诺都得到满足这一事实有关。添加一些console.log行并通过调试器运行它,我可以看到我需要这样的东西:

    editors: function() {
        this.store.find('user').then(function() {            
            return this.store.filter('user', function(model) {
                return model.get('isEditor');
            });
        });
    }.property()

但我无法弄清楚如何从乱七八糟的嵌套承诺中获取编辑器列表。

1 个答案:

答案 0 :(得分:0)

我找到了答案,而且我完全走错了路。只是每次更改记录时都会运行filter函数,其中一些时间是在填充所有字段之前。一旦爆炸,其余的就会爆炸。所以解决方案只是在使用之前检查perms是否已定义:

App.User = DS.Model.extend({
    username: DS.attr(),
    permissions: DS.attr(), //e.g. ['edit', 'read']

    isEditor: function() {
        var perms = this.get('permissions');
        if (perms)
            return perms.indexOf('edit') > -1;
        else
            return false;
    }.property('permissions')
});

来自ember的有些神秘的错误并没有帮助,但是一旦我开始专注于TypeError,就会变得更加清晰。