我为用户提供了以下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()
但我无法弄清楚如何从乱七八糟的嵌套承诺中获取编辑器列表。
答案 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
,就会变得更加清晰。