5

ApplicationController を IndexController にバインドしようとしています。これが私の jsfiddleです。要約すると、ここに私がアプリケーションコントローラーに持っているバインディングがあります

indexIsClickedBinding: "App.indexController.isClicked",

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

そのため、IndexController のisClicked値が変更されても、indexIsClickedBinding は何もしません。私のコードで何か提案が間違っていますか?

乾杯

4

2 に答える 2

23

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

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

以前のバージョンの Emberには常駐していましたが、現在は常駐しAppていません。これは、絶対名を使用してコントローラーを参照することは、コントローラー間の密結合を作成するため、悪い習慣であるためです。

そのため、Ember.JS にはコントローラーを参照する別の方法があります。現在のコントローラーに他のコントローラーが必要になるのは一般的な要件です。Ember.JS には次のメソッドがあります。

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

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

于 2013-02-07T23:15:37.977 に答える
0

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

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

ただし、最初に Ember にこのコントローラーを初期化させる必要があるため、実際には依存する計算されたプロパティを呼び出す必要がありますindex(遅延初期化されます)。たとえば、私が使用するテンプレートでは次のようになります。

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

動作デモ。

于 2015-11-19T11:41:22.813 に答える