3

在我正在使用的应用程序模板中:

  {{#if exampleModel.isDirty }}

  {{else}}

  {{/if}}

...根据视图的模型是否脏来显示不同的 Ui。这很好用。

但是,我有另一个由 ArrayController 子类支持的视图。同样,我想根据 ArrayController 中是否有任何脏项目来更改 UI。我努力了:

{{#if controller.isDirty }}

{{#if controller.content.isDirty }}

但是,尽管两者都不会产生异常,但在任何时候都不会评估为 true,即使 ArrayController 子类中的模型是脏的。

检查由 ArrayController 装饰的任何模型是否脏的正确方法是什么?

4

2 回答 2

3

我想你可以在你的 ArrayController 上定义一个计算属性:

isDirty : function(){
  this.forEach(function(model){
    var dirty = false;
    if(model.get("isDirty"))
      dirty = true;
  });
  return dirty;
}.property("content.@each.isDirty")

所以关键是属性依赖的正确声明

更新评论中的有趣问题:为什么这个功能没有嵌入到 Ember 中?

关于您对烘焙功能的评论:您正在考虑 Ember 数据。我个人不将它与 ember-data 一起使用。所以在我的情况下,这个功能是无稽之谈。因此,可以讨论将其作为 Mixin 添加到 Ember 中,以便更多地促进集成。

例子:

Ember.IsArrayDirtyMixin = Ember.Mixin.create({
    isDirty : function(){
      this.forEach(function(model){
        var dirty = false;
        if(model.get("isDirty"))
          dirty = true;
      });
      return dirty;
    }.property("content.@each.isDirty")
});

App.YourController = Ember.ArrayController.extend(Ember.IsArrayDirtyMixin,{
    .... // your stuff
});

// shorter version proposed by pjlammertyn in the comments
Ember.IsArrayDirtyMixin = Ember.Mixin.create({
    isDirty : function(){
      return !this.every(function (model) { return !model.get('isDirty'); });
    }.property("content.@each.isDirty")
});
于 2013-03-27T10:00:41.267 回答
0

或者更简单地说,假设你在一个ArrayController

  ...
  hasChanged: function() {
    var records = this.get('model');
    return records.isAny('isDirty', true);
  }.property('model.@each.isDirty'),
  isNotDirty: Ember.computed.not('hasChanged'),
  ...

这些模式真的很常见,我很惊讶它们不是内置的。

于 2015-03-25T10:53:56.490 回答