1

コントローラーへの相対パスを使用して、オブジェクトのプロパティをバインドしようとしています。古いバージョンの 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')
});
4

1 に答える 1

0

計算isSelectedされたプロパティはItemオブジェクトにありますが、のハンドラーで変更selectedIdしています。IndexControllernext

これを修正する簡単な方法は、ハンドラーisSelectedで項目オブジェクト自体にプロパティを設定することです。next

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);
}

これが更新されたjsfiddleです。

Ember Getting Started Guideを読むことをお勧めします。

あなたが直面している問題、つまり、コレクションをループしながらアイテムを区別することは、実際には Ember の itemController を使用することでより良い方法で解決されます。これを行うには、コレクションをループし、.xml で itemController を指定します#each。この要件は、Ember では非常に慣用的な方法で対処されています。代わりに、そのアプローチを使用することをお勧めします。

編集: jsfiddle リンクを修正しました。

Ember.bind相対バインディングの場合、 、 またはを使用して、別のコントローラー/オブジェクトの任意のプロパティにバインドできますEmber.Binding.fromのAPI ドキュメントを参照してくださいEmber.Binding。より高度な ember バインディングの例については、このリンクも参照してください。

于 2013-06-26T04:50:55.593 に答える