gpt4 book ai didi

SproutCore 在将 ListView 内容绑定(bind)到 ArrayController 时令人困惑

转载 作者:行者123 更新时间:2023-12-03 13:38:33 26 4
gpt4 key购买 nike

在 SproutCore 中,将 ListView.content 绑定(bind)到 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()

所以绑定(bind)到 .arrangeObjects实际上与绑定(bind)到: App.arrayController.arrangeObjects 相同

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

To support SC.Array in your own class, you must override two primitives to use it: replace() and objectAt().


SC.ArrayController中这两种方法的实现将执行一些特定于阵列 Controller 的检查并将请求转发到 .content属性(property)。

所以就像@TopherFangio 所说, SC.ArrayController是其底层 .content 的代理属性(property)。如果我绑定(bind)到 App.arrayController.content直接而不是 Controller 本身,我想我会失去所有 arrayController 的优点。

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

最佳答案

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

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

此外,我相信 Todos.todosController.length将始终是一个数字,即使内容为空。相反,调用 Todos.todosController.content.length如果 content 会抛出错误为空。

希望这可以帮助 :-)

关于SproutCore 在将 ListView 内容绑定(bind)到 ArrayController 时令人困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10201657/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com