Javascript 计算模型属性中的余烬错误

Javascript 计算模型属性中的余烬错误,javascript,ember.js,ember-data,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

我为用户提供了以下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')
});
除其他外,我使用它来获取控制器中的编辑器列表(用于
选择
)。加载页面时,在控制台中出现以下错误:

Error: Something you did caused a view to re-render after it rendered but before it was inserted into the DOM.
它发生在添加了
isEditor
函数之后,如果我注释掉函数的内容,它就可以正常工作,尽管我从中生成的列表显然是不正确的。但据我所知,代码没有问题

编辑:我正在控制器混音器中使用函数:

App.EditorsMixin = Ember.Mixin.create({
    editors: function() {
        return this.store.filter('user', function(model) {
            return model.get('isEditor');
        });
    }.property()
});
编辑2:问题似乎与调用
编辑器时并非所有的
store.find('user')
承诺都得到履行有关。添加一些
console.log
行并通过调试器运行,我可以看到我需要这样的东西:

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

但我不知道如何从杂乱无章的嵌套承诺中获得编辑列表

我找到了答案,但我完全走错了方向。很简单,
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:perms在另一个错误之前是未定义的。有没有合理的方法来调试这类问题?我所能想到的就是注释掉块,直到我找到一些有意义的东西,但这并不理想。返回对计算属性的承诺从来都不是理想的,因为通常您得到的是计算属性,而不是实际的记录/集合。上面的示例没有返回find承诺,因此这肯定行不通;)在您的情况下,如果您希望在使用特定控制器之前找到用户,最好在其中一个模型挂钩(beforeModel、model、afterModel)上的路由器中执行此操作。如果一个承诺被返回给所有这些钩子,那么所有这些钩子都将被阻塞,直到它完成为止。我还是不建议这样做。我会尝试解决潜在的问题。发表评论似乎是发现问题的最简单方法。