Ember.set和Ember.setProperties给出不同的结果

时间:2018-07-19 19:14:04

标签: javascript ember.js ember-observable

我在Ember应用程序中遇到了一个问题,其中使用Ember.setEmber.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");
        }
    }
});

PHP $_Post documentation

在上面的代码中,单击第一个按钮(Ember.setProperties)会得到Name: Vignesh Raja Place: Chennai,但是单击第二个按钮(多个Ember.set)会得到Name: Vignesh Raja Place: Namakkal

1 个答案:

答案 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"})中,设置属性nameplace,完成后,观察者将属性place更改为Chennai

因此得到结果-Name: Vignesh Raja Place: Chennai

因此,如果使用Ember.setProperties,请确保您对设置的任何属性的任何观察者都不会更改其他属性的值。