0

我在我的应用程序中遇到了一个问题,Ember即使用设置多个属性Ember.setEmber.setProperties在后者中产生了错误的结果。在这里构建了一个确切的场景。

哈佛商学院

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

4

1 回答 1

2

我遇到的问题是由于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完成后,观察者将属性更改placeChennai

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

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

于 2018-07-19T19:14:03.963 回答