【问题标题】:Ember.js: Controller property not called when attribute changedEmber.js:属性更改时未调用控制器属性
【发布时间】:2014-09-02 16:23:07
【问题描述】:

我有一个动态控制器属性,如果关系计数低于 5,它会返回布尔值:

alienCountBelow5: function() {
  return this.get('model').get('aliens').content.length < 5;
}.property('aliens'),

但即使我已指定它应该监视 aliens 的更改,当我向关系中添加新记录时它也不会更改。

这是模型:

App.Item = DS.Model.extend({
  name: DS.attr(),
  aliens: DS.hasMany('alien')
});

当我创建新记录时,我在aliens 对象上使用pushObject

我不确定应该怎么做,显然我做得不对。

演示:http://emberjs.jsbin.com/yegiku/2/edit

【问题讨论】:

    标签: javascript ember.js


    【解决方案1】:

    alienCountBelow5 计算属性应该在App.Item 中定义。并将您的模板更改为{{item.alienCountBelow5}}。我已经更新了你的jsfiddle

    注意:不幸的是,我无法让它工作,它会引发错误:Cannot read property 'resolve' of undefined。它应该与answer 一样工作。但是你应该明白这个想法,并解决问题。另外,如果您使用

    aliens: DS.hasMany('alien', {async: true}) 有点用。

    【讨论】:

    • 啊哈,所以区别在于模型上:emberjs.jsbin.com/yegiku/2/edit
    • 但我认为控制器是用来装饰模型的,那么这里有什么问题呢?这是我对模型的光学装饰。
    • 是的,但alienCountBelow5 是单个项目模型的属性,您的控制器是ArrayController,也就是说,它适用于所有项目模型。如果你有一个用于 Item 的控制器,那是最佳选择,然后你就可以拥有装饰器。
    • @RonniEgeriis 我没有得到你的 jsbin,你编辑了吗,你设法让它工作了吗?
    【解决方案2】:

    看看the docs for @each - 这是一个特殊的关键字,可以观察到数组的特定变化。

    在您的情况下,使用以下方法会起作用(观察者仅在从数组中添加删除记录时触发):

    alienCountBelow5: function() {
      return this.get('model').get('aliens.length') < 5;
    }.property('aliens.[]'),
    

    【讨论】:

    • 它似乎不起作用。根据您的建议更新alienCountBelow5 后,我收到错误“无法读取未定义的属性'resolve'”。然后我尝试将{async:true} 添加到关系中,但后来我处于现状:emberjs.jsbin.com/yegiku/2/edit
    • 好的,现在我明白了你的代码。它不工作的原因是因为您的model 是一个记录的array,因此在您的ArrayController 上放置一个计算属性将没有用。相反,我将属性放在您的模型上(如果您认为这不是与模型相关的逻辑,您也可以将其放在 ItemController 上)。见这里:emberjs.jsbin.com/poqobevukozo/1/edit
    • 是的,我想通了。感谢ArrayControllerItemController 的示例!
    猜你喜欢
    • 1970-01-01
    • 2013-10-13
    • 1970-01-01
    • 2019-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多