Javascript 计算模型属性中的余烬错误
我为用户提供了以下Ember模型,其中包含权限列表: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
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)上的路由器中执行此操作。如果一个承诺被返回给所有这些钩子,那么所有这些钩子都将被阻塞,直到它完成为止。我还是不建议这样做。我会尝试解决潜在的问题。发表评论似乎是发现问题的最简单方法。