2014-03-29 76 views
0

在餘燼,灰燼集的對象和數組

var Test = Ember.Object.create({ 
name: "Ember", 
changeableName: "", 
resetName: function() { 
this.set('changeableName', this.get('name')); 
} 
}); 

Test.resetName(); 
Test.get('changeableName');  // Ember 
Test.get('name');  // Ember 
Test.set('changeableName', "Ember Test");  
Test.get('changeableName');  // Ember Test 
Test.get('name');  // Ember 

這工作得很好,這是預期的行爲。

但是,如果使用對象或數組這樣它反映了改回原來的財產,

var Test = Ember.Object.create({ 
nameObj: {"name":"Ember"}, 
changeableName: {}, 
resetName: function() { this.set('changeableName', this.get('nameObj')); } 
}); 

Test.resetName(); 
Test.get('changeableName.name');  // Ember 
Test.get('nameObj.name');  // Ember 
Test.set('changeableName.name', "Ember Test");  
Test.get('changeableName.name');  // Ember Test 
Test.get('nameObj.name');  // Ember Test 

這是不公平的。我不希望更改反映回原始對象.Ember.set適用於基本類型,但對於對象和數組,它不是我想要的。

這種情況下有什麼解決辦法嗎?

回答

1

我不會說這是不公平的。 這正是如何對象和對象引用 :-)

這就是你基本上要做到:

  • 沒有包含可以被修改一個對象的屬性。
  • 有一個重置函數,它應該將上述屬性重置爲某種模板對象(= nameObj)中指定的值。

但這裏是你在你的代碼做什麼:

  • 酒店changeableName設置爲向nameObj點。
  • 您可以對對象進行更改。
  • 您再次將屬性changeableName設置爲指向nameObj。

你看到問題了嗎?您必須調整重置功能,以便始終根據您的「模板對象」(nameObj)創建一個新對象。下面的代碼應該這樣做:-)

var Test = Ember.Object.create({ 
nameObj: {"name":"Ember"}, 
changeableName: {}, 
resetName: function() { 
    var hash = this.get('nameObj'); 
    this.set('changeableName', Ember.Object.create(hash)); 
} 
}); 
Test.resetName(); 
Test.get('changeableName.name');  // Ember 
Test.get('nameObj.name');  // Ember 
Test.set('changeableName.name', "Ember Test");  
Test.get('changeableName.name');  // Ember Test 
Test.get('nameObj.name');  // Ember 
+0

感謝mavilein。有用:) – Bala