我正在寻找使用控制器的相对路径绑定我的对象上的属性。在旧版本的ember中,控制器具有绝对路径。有一段时间,似乎你可以使用getPath来获取相对路径。在RC5中,我不确定如何绑定到相对路径。
在这个小提琴中,我想将每个项目绑定到控制器中名为selectedId的属性:
http://jsfiddle.net/skwd/eR9r8/
但是,在控制器的上下文中,我不确定如何进行绑定。我无法访问(据我所知)绝对或相对控制器路径。
App.MyController = Ember.Controller.extend({
selectedId: 0,
...
// items is an array of ember objects, each with a title and ID
preparedItems: function() {
var prepared = [];
this.items.forEach(function(item) {
// bind item.selectedId to this.selectedID?
});
}.property('items')
});
答案 0 :(得分:0)
您的isSelected
计算属性位于Item
对象上,但您正在更改selectedId
的{{1}}处理程序中的IndexController
。
解决此问题的一种快速方法是在next
处理程序中设置项目对象本身的isSelected
属性。
next
这是更新的jsfiddle。
说过我会建议阅读Ember Getting Started Guide。
您面临的问题,即: - 在循环集合时区分项目,实际上是使用Ember的itemController以更好的方式解决的。您可以通过循环遍历集合并在next: function() {
var selectedId = this.get('selectedId');
var prevItem = this.items[selectedId];
if (prevItem) {
prevItem.set('isSelected', false);
}
var nextId = Math.min(this.get('selectedId') + 1, this.items.length - 1);
this.set('selectedId', nextId);
var nextItem = this.items[nextId];
nextItem.set('isSelected', true);
}
中指定itemController来完成此操作。 Ember以一种非常惯用的方式解决了这个要求,我建议使用这种方法。
编辑:修正了jsfiddle链接。
对于相对绑定,您可以使用#each
或Ember.bind
绑定到另一个控制器/对象的任何属性。查看Ember.Binding.from
的{{3}}。有关更高级的ember绑定示例,请参阅api docs。