2013-02-07 8 views
5

私は、ApplicationControllerをIndexControllerにバインドしようとしています。 Here is my jsfiddle。要約すると、ここで私が変更されたはIndexControllerで値をisClickedアプリケーションコントローラEmber.js:コントローラ間のデータバインド

indexIsClickedBinding: "App.indexController.isClicked", 

isIndexClicked: function() { 
    alert("its changed to " + this.get("indexIsClicked")) ; 
}.observes('indexIsClicked'), 

ので、中に持って結合されていますが、indexIsClickedBindingは何もしません。私のコードで何が間違っていますか?

歓待

答えて

23

解決策は簡単ですが、私はそれを試してみましょう。ご不明な点がございましたら、お気軽にご質問ください。

App.indexControllerのプロパティにバインドされました。ただし、Ember.JSはコントローラのインスタンスを直接Appに配置しないため、このインスタンスは存在しません。

コントローラの間にtight couplingが作成されるため、以前のバージョンのEmberではそれは以前のバージョンのEmberにありましたが、絶対名を使用してコントローラを参照することは悪い習慣です。

Ember.JSにはコントローラを参照する他の方法があります。現在のコントローラに他のコントローラを必要とすることが一般的な要件です。 Ember.JSは、次の方法があります:Ember.Route

したがって、needsを実装すると、コントローラには他のコントローラへのアクセスとそれが所有するプロパティ:http://jsfiddle.net/uB5tX/7/

needsを使用することで、コントローラが疎結合しています。私たちは名前でEmber.JSを参照してくれました。 Appを変更した場合、何も変更する必要はなく、Ember.JSがコントローラーの動作を変更する場合は、needsを再度更新する必要はありません。動作が変更されるとneedsも更新されるため正しいコントローラを戻します。

ます。また、他のコントローラのプロパティにアクセスするには、次の構文を使用することができ
+0

おかげでたくさん!あなたがアプリをやることができないならば。someController、これは#eachのテンプレートでどのように動作するのですか?** {{#each App.someController}} **? –

+1

'needs'アプローチを使用している場合、' Controller'パートを指定する必要はありません。 'IndexController'が' Another''Controller'を必要とする場合、 'IndexController'に' controllers.another'と参照するだけです。ビューについても同様です: '#each controllers.another'。 – Wildhoney

+0

最後の1つの状況。どのようにArrayControllerについて、あなたはそれをループするでしょう。 [this](http://jsfiddle.net/ud3323/4ysxQ/)のフィドルでは、彼らはまだそれを古いものにしていますが、私は[this]で動作するようにはできません(http://jsfiddle.net/jeanluca/ 'content'の代わりに' context'を指定すると、それらの前に何も指定しなくても、プロパティ( 'name'、etc ...)のためにまっすぐに行くことができます:http://www.web5tx.com/9/)fiddle –

0

:あなたはエンバーが最初にこのコントローラを初期化するために必要なので、あなたが実際に(それは意志indexに依存して、いくつかの計算されたプロパティを呼び出す必要が

import Ember from 'ember'; 

export default Ember.Controller.extend({ 
    index: Ember.inject.controller('index'), 
    indexIsClicked: Ember.computed.alias("index.isClicked"), 

    isIndexClicked: Ember.observer('index.isClicked', function() { 
    alert("its changed to " + this.get("indexIsClicked")); 
    }) 
}); 

を遅く初期化する)。だから、テンプレートで例えば私が使用します。

Is index clicked: <b>{{indexIsClicked}}</b> 

Working demo.

関連する問題