【问题标题】:Ember error in computed model property计算模型属性中的 Ember 错误
【发布时间】: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


【解决方案1】:

我找到了答案,但我完全走错了方向。很简单,每次更改记录时都会运行 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,就会变得清晰很多。

【讨论】:

    猜你喜欢
    • 2014-01-07
    • 1970-01-01
    • 2016-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-10
    • 2014-07-04
    • 2012-09-28
    相关资源
    最近更新 更多