2

我试图了解在视图集合中绑定属性的最佳方式。

根据您的文档,在 MVC 架构中,“我们实际上应该将视图的属性绑定到控制器层”,而不是直接绑定到模型实例。当我们有一个只控制一个对象的控制器时,这很有效,但是当我们处理集合时,它似乎并没有那么好。

在您的典型 ToDos 示例中,您的观点是

{{#collection contentBinding="Todos.todosController" tagName="ul"
 itemClassBinding="content.isDone"}}
  {{view Em.Checkbox titleBinding="content.title"
    valueBinding="content.isDone"}}
{{/collection}}

这本质上是直接绑定到每个模型的属性。我知道数组控制器以某种方式代理了这些属性,但是您仍然只能引用直接存在于模型对象上的那些属性。

假设在我的 ToDo 应用程序中,我想在视图上添加更多状态,例如,我希望它能够展开或折叠。如果我有一个表示整个 ToDo 视图的视图对象,包括扩展框架和内容,我希望该视图上的某些属性“isExpanded”绑定到某些东西。

如果我只有一个对象和一个非数组控制器,我可能会在控制器中放置一个“isExpanded”属性。然后,当您翻转小三角形图标时,我可以在控制器上设置此属性,视图会注意到这一点并展开。

但是对于数组控制器,没有明显的方法来拥有这个属性并让它引用单个 ToDos。从上面的规范示例中,似乎我必须绑定到模型上的属性。但是,将它作为临时的、以视图为中心的属性(如“isExpanded”)直接放入 ToDo 模型本身似乎很愚蠢。

有什么建议么?

4

1 回答 1

0

不要在控制器上放置属性。至少在 ember 派生的 Sproutcore 中,这会导致模型状态发生更改,这是您不希望的,因为该属性不在模型上。此外,视图的展开状态是视图关注点;该模型不关心它的显示方式。保持 MVC。

expanded属性放在视图本身上,并使其成为displayProperties数组中的值。 查看 ember 代码(第 599 行)

每当该数组中的值发生更改时,视图应该重新呈现。无论如何,这就是我在 Sproutcore 中会做的事情。

更新您的评论。两种方法:

1)定义类似的东西

displayProperties: ['expand']
...
expandBinding: Em.Binding.oneWay('xyz')

关于你的意见。这样,当您的 1 触发器更改时,所有项目视图都会扩展。

2)保留对您的视图的引用,并在您的状态图中,当用户单击展开按钮时,循环浏览视图并设置展开属性。

选项 1 更简单,但创建大量绑定会影响性能。选项 2 不使用大量绑定。可能想从选项 1 开始,然后如果性能有问题,请转到选项 2。

于 2012-07-03T13:58:46.253 回答