0

SproutCore では、ListView.content を ArrayController にバインドするのが一般的な方法です。

Todos.todosController = SC.ArrayController.create({
});

SC.ListView.design({
    contentBinding: SC.Binding.oneWay('Todos.todosController'),
    exampleView: SC.CheckboxView.design({
      ..........
    })
})

しかし、SC.CollectionView から拡張された ListView の「コンテンツ」フィールドは SC.Array です。

contentBinding: SC.Binding.oneWay('Todos.todosController.content')

任意の説明をいただければ幸いです。下手な英語でごめんなさい。

@TopherFangioの実装を調べたところ、それが属するオブジェクトを返す非常に単純な計算されたプロパティであることがSC.ArrayControllerわかりました。.arrangedObjects

arrangedObjects: function() {
    return this;
}.property().cacheable()

したがって、へのバインディング.arrangeObjectsは、実際には次へのバインディングと同じです。App.arrayController.arrangeObjects

また、必要な 2 つのメソッド「replace()」と「objectAt()」SC.ArrayControllerが拡張および実装されていることもわかりました。SC.Array

独自のクラスで SC.Array をサポートするには、replace() と objectAt() の 2 つのプリミティブをオーバーライドして使用する必要があります。

これら 2 つのメソッドを実装するとSC.ArrayController、アレイ コントローラー固有のチェックが行われ、要求が.contentプロパティに転送されます。

@TopherFangioが言ったように、それはその基礎となるプロパティSC.ArrayControllerのプロキシです。.contentコントローラー自体ではなく直接バインドするとApp.arrayController.content、arrayController のすべての利点が失われると思います。

@TopherFangioの多大なご協力に改めて感謝いたします。

4

1 に答える 1

1

SC.ArrayControllerは、実際にはプロキシ オブジェクトであり、いくつかの優れた機能を提供します。

確かにプロパティにバインドできますが、プロパティにバインドしてプロパティを設定.contentすることもできます。これにより、バインドされたリストを変更して自動的に更新できます。一般的に、これはあなたがしたいことです。.arrangedObjectsorderByorderBy

さらに、Todos.todosController.lengthコンテンツがnullであっても、常に数値になると思います。対照的に、nullTodos.todosController.content.lengthの場合、呼び出しはエラーをスローします。content

お役に立てれば :-)

于 2012-04-18T21:59:53.073 に答える