Ember.js 如何检查对ember js中的对象所做的脏更改

Ember.js 如何检查对ember js中的对象所做的脏更改,ember.js,Ember.js,我有一个对象,当对象中键的任何值发生变化时,我想更新一个计算属性。是否有一种方法可以观察具有计算属性的对象的值更改。您可以在模型中定义计算属性,如下所示: App.Person = DS.Model.extend({ firstName: DS.attr('string'), lastName: DS.attr('string') /* COMPUTED */ fullName: function() { return this

我有一个对象,当对象中键的任何值发生变化时,我想更新一个计算属性。是否有一种方法可以观察具有计算属性的对象的值更改。

您可以在模型中定义计算属性,如下所示:

App.Person = DS.Model.extend({
    firstName:     DS.attr('string'),
    lastName:      DS.attr('string')

    /* COMPUTED */
    fullName: function() {
        return this.get('firstName') + ' ' + this.get('lastName');
    }.property('firstName', 'lastName')
});
现在,您可以使用新的
fullName
属性,只要
firstName
lastName
发生更改,该属性就会神奇地更新

更新

为了在发生更改时插入服务器,可以在ObjectController中执行类似操作:

changesObserver: function() {
    // this will be called everytime one of the attribute is changed
    // so you could do your server post here I guess
    Ember.$.ajax(/*...*/);
}.observes('attributeA', 'attributeB', etc)

可以在模型中定义计算特性,如下所示:

App.Person = DS.Model.extend({
    firstName:     DS.attr('string'),
    lastName:      DS.attr('string')

    /* COMPUTED */
    fullName: function() {
        return this.get('firstName') + ' ' + this.get('lastName');
    }.property('firstName', 'lastName')
});
现在,您可以使用新的
fullName
属性,只要
firstName
lastName
发生更改,该属性就会神奇地更新

更新

为了在发生更改时插入服务器,可以在ObjectController中执行类似操作:

changesObserver: function() {
    // this will be called everytime one of the attribute is changed
    // so you could do your server post here I guess
    Ember.$.ajax(/*...*/);
}.observes('attributeA', 'attributeB', etc)

计算属性和观察者是两个不同的东西。计算属性会自动“观察”指定的属性,并在需要时惰性地重新计算自己。当您希望在属性更改时立即执行某些操作时,观察者的使用频率较低。在你的例子中,你似乎希望在你的模型中有这样的东西。如果它确实是一个
DS.Model
,那么您可以使用
isDirty
。如果您希望将其放入控制器中,请使用
model.isDirty
(或在最新版本的Ember Data
model.hasddirtyAttributes
)代替:

如果希望在任何模型属性更改时重新计算计算出的属性,可以将
isDirty
列为依赖项。这是控制器属性的一个示例:

canSave: function() {
  return this.get('isEditing') && this.get('model.isDirty');
}.property('isEditing', 'model.isDirty')
然后,举例来说

<button class="{{if canSave 'active'}}">Save</button>
保存
当用户处于编辑模式且模型变脏时,该按钮将自动激活(通过
活动
CSS类)

保存模型时,
isDirty
标志被清除。如果您不保存模型,但希望清除
isDirty
标志,则可以执行以下操作:


如果要观察非
DS.Model
对象上的所有属性更改,或观察模型上自己定义的属性更改(与
DS.*
类型属性相反),则这是一个很难解决的问题。Ember不提供现成的解决方案。您可以在谷歌上搜索“观察对余烬对象属性的更改”,或者查看作为副本提出的问题。

计算属性和观察者是两件不同的事情。计算属性会自动“观察”指定的属性,并在需要时惰性地重新计算自己。当您希望在属性更改时立即执行某些操作时,观察者的使用频率较低。在你的例子中,你似乎希望在你的模型中有这样的东西。如果它确实是一个
DS.Model
,那么您可以使用
isDirty
。如果您希望将其放入控制器中,请使用
model.isDirty
(或在最新版本的Ember Data
model.hasddirtyAttributes
)代替:

如果希望在任何模型属性更改时重新计算计算出的属性,可以将
isDirty
列为依赖项。这是控制器属性的一个示例:

canSave: function() {
  return this.get('isEditing') && this.get('model.isDirty');
}.property('isEditing', 'model.isDirty')
然后,举例来说

<button class="{{if canSave 'active'}}">Save</button>
保存
当用户处于编辑模式且模型变脏时,该按钮将自动激活(通过
活动
CSS类)

保存模型时,
isDirty
标志被清除。如果您不保存模型,但希望清除
isDirty
标志,则可以执行以下操作:


如果要观察非
DS.Model
对象上的所有属性更改,或观察模型上自己定义的属性更改(与
DS.*
类型属性相反),则这是一个很难解决的问题。Ember不提供现成的解决方案。你可以在谷歌上搜索“观察余烬对象属性的变化”,或者重复查看提议的问题。

我想观察计算属性中的对象数据变化我不确定你想实现什么。。。你能给我举个例子吗?我有一个已经填写的表单,当表单中的任何一个值发生变化时,我想通知服务器表单已经更新。表单中的所有字段都是键:值对在model objectto observer中,我必须观察对象的每个属性,比如。observers(object.attributeA、object.attributeB、object.attributeC)等等,所以我想知道观察对象所有属性的简写方法。observers(object)与其指定每个属性,不如使用循环订阅观察者:我想观察对象数据在计算属性中的变化我不确定你想实现什么。。。你能给我举个例子吗?我有一个已经填写的表单,当表单中的任何一个值发生变化时,我想通知服务器表单已经更新。表单中的所有字段都是键:值对在model objectto observer中,我必须观察对象的每个属性,比如。observers(object.attributeA、object.attributeB、object.attributeC)等等,所以我想知道观察对象所有属性的简写方法。observers(object)与其指定每个属性,不如订阅一个循环来观察对象:要观察对象的每个属性,我必须观察like.observators(object.attributeA,object.attributeB,object.attributeC)等等,所以我想知道观察对象所有属性的简写方法与其指定每个属性,为什么
isDirty
不适用于您想要做的事情