我在Ember
应用程序中遇到了一个问题,其中使用Ember.set
和Ember.setProperties
设置多个属性在后者中产生了错误的结果。在这里构造了一个精确的场景。
HBS :
Name: {{name}}<br>
Place: {{place}}<br><br>
<button {{action "modifyTogether"}}>this.setProperties({name:"Vignesh Raja",place:"Namakkal"})</button>
<br><br><br>
<button {{action "modifySeperately"}}>this.set("name","Vignesh Raja");<br>this.set("place","Namakkal");</button>
<br><br><br>
When set seperately, we get the latest value - {name:"Vignesh Raja", place:"Namakkal"}<br>
When set together, we get the latest value from the observer- {name:"Vignesh Raja", place:"Chennai"}<br>
<br>
<br>
JS :
import Ember from 'ember';
export default Ember.Controller.extend({
name:"Vignesh",
place:"Nmkl",
handleName1 : function(){
this.set("place","Chennai");
}.observes("name"),
actions:{
modifyTogether:function(){
this.setProperties({name:"Vignesh Raja",place:"Namakkal"})
},
modifySeperately:function(){
this.set("name","Vignesh Raja");
this.set("place","Namakkal");
}
}
});
在上面的代码中,单击第一个按钮(Ember.setProperties
)会得到Name: Vignesh Raja Place: Chennai
,但是单击第二个按钮(多个Ember.set
)会得到Name: Vignesh Raja Place: Namakkal
答案 0 :(得分:1)
我遇到的问题是由于为Ember Observer
属性分配了name
。
分别更新时,第一个this.set("name","Vignesh Raja")
设置name
属性的值。然后将其观察者触发,并将place
属性更改为Chennai
。在这些之后,第二条语句this.set("place","Namakkal")
被触发。因此,我们将Namakkal
作为最终值。
显示结果-Name: Vignesh Raja Place: Namakkal
一起更新时,Ember.setProperties
缓冲观察者,直到传递的所有属性都更新为止。它使用Ember.beginPropertyChanges
对属性更改进行分组,并且值更改通知不会发送给观察者。设置属性后,将调用Ember.endPropertyChanges
,依次将通知发送给观察者。因此,在上面的示例this.setProperties({name:"Vignesh Raja",place:"Namakkal"})
中,设置属性name
和place
,完成后,观察者将属性place
更改为Chennai
。
因此得到结果-Name: Vignesh Raja Place: Chennai
。
因此,如果使用Ember.setProperties
,请确保您对设置的任何属性的任何观察者都不会更改其他属性的值。