5

私はこの質問に答えようとしていました: emberjs: アプリの初期化後にルートを追加()

私は Ember.Object.reopen() をいじり始め、それがどのように機能するかを理解し、おそらく前の質問に答える方法を見つけました。

私は少し困惑しており、このコードの動作を理解していません:

jsfiddle: http://jsfiddle.net/Sly7/FpJwT/

<script type="text/x-handlebars">
  <div>{{App.myObj.value}}</div>
  <div>{{App.myObj2.value}}</div>
  <div>{{App.myObj3.value}}</div>
</script>
App = Em.Application.create({});

App.MyObject = Em.Object.extend({value: 'initial'});

App.set('myObj', App.MyObject.create());

Em.run.later(function(){
  App.get('myObj').reopen({
    value: "reopenOnInstance"        
  }); // the template is not updated, 'initial' is still diplayed, but
  console.log(App.get('myObj').get('value')); // print 'reopenOnInstance'

  App.MyObject.reopen({
    value: "reopenOnClass"      
  });
  App.set('myObj2',App.MyObject.create()); // the template is updated and 
  console.log(App.get('myObj2').get('value')); //print 'reopenOnClass'

  App.myObj3 = App.MyObject.create(); // the template is not updated but
  console.log(App.myObj3.get('value')); // print 'reopenOnClass'

  Em.run.later(function(){
    App.get('myObj').set('value', "setWithSetter"); // the template is updated and
    console.log(App.get('myObj').get('value')); // print 'setWithSetter'

    App.get('myObj2').set('value', "setWithSetter"); // the template is updated and
    console.log(App.get('myObj2').get('value')); // print 'setWithSetter'

    App.myObj3.set('value', "setWithSetter"); // the template is not updated but
    console.log(App.myObj3.get('value')); // print 'setWithSetter'

  }, 2000);
},2000);

reopen誰かが何が起こっているのか、特にテンプレートが時々更新されない、時々更新される理由、そしてクラスの呼び出しとインスタンスの呼び出しの違いを説明できる場合。

4

1 に答える 1

5

100%確実ではありませんが、質問にお答えします。

まず「myObj3」を見てみましょう。ember の getter/setter メソッドは、テンプレートの更新をトリガーします (すべてのプロパティ/オブザーバーに何かが起こったことを知らせる内部イベントを発生させます)。値を手動で設定するだけで値は更新されますが、これらのイベントは発生しないため、UI は何も変化しません。Mutable リストを使用する場合、pushObject を使用して UI が確実に更新されるようにします。

次に、「再開」を見てみましょう。クラスを再度開くと、期待どおりに機能し、基本クラスが更新されます。インスタンスを再度開くと、実際にはミックスインが作成され、オブジェクトの上にシムされます。これは、「get」を実行すると、値が返されるようにミックスインとオブジェクトを反復処理することを意味します。その mixin を見つけて、オブジェクトの前に値を取得します。「foo initial」を取得するインスタンスで、実際にメソッドを「return 'foo '+this._super()」に置き換えることができます(オブジェクトにタマネギのようなレイヤーがあると考えてください)。オブジェクトの上に mixin のグループがある場合、何かを直接設定すると正しい値を見つけるのに苦労します (ただし、「get」は完全に機能します)。これは、常に「set」を使用する必要があるという一般的なルールにつながります

補足:「get」の代わりに「getPath」を呼び出すことができ、相対パスまたは絶対パスを使用できます。コードを管理しやすくする App.getPath('myObj2.value') など。「setPath」にも当てはまります。

最後に:値を変更したため(そこにあります)、最後の値が出力されますが、「myObj3」オブジェクトでsetを呼び出したことがないため、emberがUIを更新するトリガーは発生しませんでした。

編集: ember の最新バージョンでは、インスタンスの再オープンがオブジェクトのマージダウンを行うように見えます (そのキーが既に存在する場合)。mixin は、新しいコンテンツを追加する場合にのみラップされます。

于 2012-08-04T01:18:43.663 に答える