如何将属性绑定到Ember.JS中的相对控制器路径

时间:2013-06-26 04:10:23

标签: ember.js

我正在寻找使用控制器的相对路径绑定我的对象上的属性。在旧版本的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')
});

1 个答案:

答案 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链接。

对于相对绑定,您可以使用#eachEmber.bind绑定到另一个控制器/对象的任何属性。查看Ember.Binding.from的{​​{3}}。有关更高级的ember绑定示例,请参阅api docs