我試圖回答這個問題:emberjs: add routes after app initialize()玩Ember.Object.reopen(),爲什麼我有這些結果?
我開始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
有什麼區別。
這一切都有道理。非常感謝你給我啓迪。所以如果我理解的很好,重新打開一個像我這樣做的實例,與'App.get('myObj')。value ='reopenOnInstance''有同樣的行爲吧? 我知道了getPath,方法,現在使用最新的ember,get具有相同的行爲,您可以執行'obj.get('otherObj.someProperty')'。 – 2012-08-04 08:06:31
請參閱編輯。這意味着你是正確的,直接設置值就像重新打開實例一樣。但是如果你有一些綁定到那個值的東西(比如UI),Ember會拋出一個錯誤,因爲沒有使用「set」(使用[fiddler](http://jsfiddle.net/scispear/n5B5d/)來查看錯誤)。 – SciSpear 2012-08-04 13:22:54
再次感謝您的編輯:)。我認爲現在答案是完整的,因爲我沒有更多的事情要闡明。 – 2012-08-04 17:36:34