3

私が使用しているアプリケーションのテンプレートでは、次のようになります。

  {{#if exampleModel.isDirty }}

  {{else}}

  {{/if}}

...ビューのモデルがダーティであるかどうかに応じて異なるUiを表示します。これはうまく機能します。

ただし、ArrayControllerサブクラスに裏打ちされた別のビューがあります。ここでも、ArrayControllerにダーティアイテムがあるかどうかに基づいてUIを変更したいと思います。私が試してみました:

{{#if controller.isDirty }}

{{#if controller.content.isDirty }}

ただし、どちらも例外を生成しませんが、ArrayControllerサブクラスのモデルがダーティであっても、どの時点でもtrueと評価されません。

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 に答える