【发布时间】:2014-10-09 20:19:44
【问题描述】:
我有以下 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: 似乎问题可能与调用editors 时并非所有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()
但我不知道如何从嵌套承诺的混乱中获取编辑器列表。
【问题讨论】:
-
我怀疑是那个代码,可能是使用它的模板,你介意包括那个吗? emberjs.jsbin.com/OxIDiVU/940/edit
-
我的完整代码很难粘贴到 bin 中,当然我现在不能让一个小例子失败!有时我会在另一个错误之前得到
TypeError: perms is undefined。有没有一种合理的方法来调试这类问题?我能想到的只是注释掉块,直到我找到一些有所作为但并不理想的东西。 -
将承诺返回给计算属性绝不是理想的,因为通常你得到的是计算属性,而不是实际的记录/集合。上面的示例没有返回 find 承诺,所以这绝对行不通;)在您的情况下,如果您希望在使用特定控制器之前找到用户,最好在路由器上执行此操作模型钩子之一(beforeModel、model、afterModel)。如果一个 promise 被返回给它们,那么所有这些钩子都会阻塞,直到它完成。我仍然不建议这样做。我会尝试解决根本问题。
-
注释掉似乎是找到问题的最简单方法。
标签: javascript ember.js ember-data