4

ドキュメントで読んでいるように、コントローラーはメソッドを呼び出したり、関連付けられたビューのプロパティを変更したりしないでください。代わりに、ビューは関連付けられたコントローラーの状態をバインドする必要があります。

これを持っている:

App.MyController = Ember.Controller.extend({
    myViewVisible:false,
    toggleViewVisibitity:function(){
        this.set('myViewVisible', !this.get('myViewVisible'));
    }
}
App.MyView = Ember.View.extend({
    isVisible:function(){
        return this.get('myViewVisible');
    }.observes('myViewVisible')
}

別のコントローラーからtoggleViewVisibilityを呼び出すと、ビューで何も起こりません。

どうすれば正しくできますか?

前もって感謝します

4

1 に答える 1

8

これは次のように機能するはずです。

App.MyController = Ember.Controller.extend({
    myViewVisible:false,
    toggleViewVisibitity:function(){
        this.set('myViewVisible', !this.get('myViewVisible'));
    }
}
App.MyView = Ember.View.extend({
    isVisible:function(){
        return this.get('controller.myViewVisible');
    }.property('controller.myViewVisible'),
    // even shorter version of the above
    isVisible : Ember.computed.alias("controller.myViewVisible")
}

コードに必要な変更:

  1. ビューのisVisibleプロパティをオブザーバーからプロパティに変更しました。監視対象のプロパティが変更されるたびに、オブザーバーが起動(=関数が実行)します。したがって、これは必要なものではありません。ただし、Emberから次のようにアクセスできるようにプロパティとして定義する必要があります:view.get( "isVisible")。したがって、私はそれをプロパティに変更しました。
  2. プロパティの依存キーを変更しました。コントローラーは、プロパティコントローラーのビューに割り当てられます。したがって、アクセスするには、目的のプロパティの前にコントローラーを付ける必要があります。
  3. ご覧のとおり、 Ember.computed.aliasを使用して、このロジックのさらに短いバージョンも提供しましたが、最初に、より詳細なソリューションを紹介したいと思います。
于 2013-03-10T22:14:33.927 に答える