绑定到Ember.js中集合视图中的瞬态属性

时间:2012-07-03 13:49:41

标签: ember.js

我正在尝试了解在一组视图中绑定属性的最佳方法。

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

在您的cannonical 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模型中,这似乎很愚蠢。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

不要在控制器上放置属性。至少在Embress派生的Sproutcore中,这会导致模型状态发生变化,这是您不想要的,因为该属性不在模型上。此外,视图的扩展状态是一个观点问题;该模型并不关心它的显示方式。保持MVC。

expanded属性放在视图本身上,并使其成为displayProperties数组中的值。 Looking thru the ember code (line 599)

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

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

1)定义类似

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

关于你的观点。这样,当您的1次触发更改时,所有项目视图都将展开。

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

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