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

我还发现SC.ArrayController扩展SC.Array并实现了两个必需的方法“replace()”和“objectAt()”。

要在您自己的类中支持 SC.Array,您必须重写两个原语才能使用它:replace() 和 objectAt()。

这两个方法的实现SC.ArrayController将做一些数组控制器特定的检查并将请求转发到.content属性。

因此,就像@TopherFangio 所说的那样,SC.ArrayController它是其基础.content属性的代理。如果我直接绑定到App.arrayController.content而不是控制器本身,我想我将失去所有 arrayController 的优点。

再次感谢您的大力帮助@TopherFangio。

4

1 回答 1

1

SC.ArrayController实际上是一个代理对象,它为你做了一些好事。

您当然可以绑定到该.content属性,但您也可以绑定到该.arrangedObjects属性并设置该orderBy属性。这将让您修改orderBy并让绑定列表自动更新。一般来说,这就是你想要做的。

此外,我相信这Todos.todosController.length将永远是一个数字,即使内容为空。相反,如果为 null ,则调用Todos.todosController.content.length将引发错误。content

希望这可以帮助 :-)

于 2012-04-18T21:59:53.073 回答