1

計算されたプロパティを持つビューがあります。依存関係が更新されると、オブザーバーは適切に起動しますが、計算されたプロパティは起動しません。理由は何ですか?

ハンドルバー:

{{#view viewName currencyBinding="changingValue"}}
    {{view.prefix}}
{{/view}}

ビューで:

prefix: (function() {
  //does not get called!!! 
  console.log('computed property fired');
  return this.get('currency');
}).property('currency')

observeCurrency: (function() {
  //gets called!
  return console.log('observer fired');
}).observes('currency')

「changeingValue」が更新されたときにオブザーバーが起動されますが、プロパティは更新されません! また、オブザーバーに「プレフィックス」を設定すると:

observeCurrency: (function() {
    //gets called!
    console.log('observer fired');
    return this.set('prefix', this.get('currency'));
}).observes('currency')

ビューを明示的に再レン​​ダリングしない限り、HTML は更新されません。なぜそれが起こっているのですか?

4

1 に答える 1

4

すべてのコードなしで何が起こっているのかを言うのは難しいですが、見てみましょう...したがって、コメントで述べたように、計算されたプロパティのラップを削除する必要があるので、ビューには次のようなプロパティがあります。

SomeView: Em.View.extend({
    // other stuff...
    prefix: function() {
        console.log('prefix being called');
        // code that returns something goes here
    }.property('currency'),
    // other stuff...
})

今、私が問題であると信じていることに、どの通貨が必要かを示すこのシナリオをシミュレートするフィドルを作成しました。計算されたプロパティには、プレフィックスが何であるかを判断するロジックがあります。(ソースはこちらからご覧いただけます)。

あなたのコードでは、バインドするときにchangingValue、このプロパティがどこから来るのかを指定していません。Ember がアプリケーション内のオブジェクトのプロパティに解決できないパスを渡しています。私が書いたフィドルでは、プロパティchangingValueが私のアプリケーション (私は SomeApp と名付けました) に属していることに注意してください。次に、このプロパティへのパスはSomeApp.changingValueであり、ハンドルバーのバインディングは次のようになります。

{{view SomeApp.SomeView currencyBinding="SomeApp.changingValue"}}'

また、そのフィドルで、そのcontentプロパティを親ビューからの通貨の値にバインドする子ビューを作成したことに注意してください。コードchangingValue内のプロパティが親ビューに属している場合にパスがどのようになるかを確認できるように、そこに追加しただけです。

これが役立つことを願っています。

于 2012-12-06T19:34:04.433 に答える