如何在Ember 2.13.0中检测并保存关系变化?

时间:2017-05-12 22:03:21

标签: ember.js ember-data ember-2.0.0

我有文件清单。每个文档都有 belongsTo 定义的客户端属性。

当用户在其中一个文档中更改客户端时,我想在计数器中显示更改了多少文档。当用户决定按下"发布"按钮,将文档客户端更改保存到api。

ember 2.13中的DS.Model具有参数(https://emberjs.com/api/data/classes/DS.Model.html):

hasDirtyAttributes, dirtyType

他们都没有对Ember 设计 belongsTo / HasMany 更改做出反应。我看到了很多关于这个主题的答案,但我没有在2.13文档中看到任何 isDirty()方法,也没有看到任何 .send(" becomeDirty")在脏状态下手动设置文档模型的方法?我还看到了几个旧版Ember版本的插件/ mixins。

但我的问题是,Ember的创作者"建议/建议/最佳实践"处理这个。是否有一些基本的方法/手动解决方案,不需要任何第三方插件?与模型中的每个关系的onchangechangever一样,或者与子模型相关的@ each.dirtyType的计算属性(甚至设置子项不会被标记为脏本身?)?

在Ember 2.13中,什么是沙盒解决方案?

2 个答案:

答案 0 :(得分:0)

已经有一段时间了。对于has-many,我使用这个解决方案。如果用户更改与以前相同的项目组有多个关系,'isTasksDirty'将返回false:

/* RELATIONS DIRTINESS */
    isRelationDirty: Ember.computed(
        'isDepartmentsDirty',
        'isTasksDirty'
        {
            get(key) {
                return this.get("isDepartmentsDirty") ||
                       this.get("isTasksDirty");
            },
            set(key, value) {
                this.set("isDepartmentsDirty", value);
                this.set("isTasksDirty", value);
            }
        }
    ),

    isTasksDirty:false,
    tasksChanged: Ember.observer('tasks.[]', function() {
        if(!arraysEqual(this.get("tasks").content.currentState, this.get("tasks").content.canonicalState)){
        this.set("isTasksDirty", true);
    } else {
        this.set("isTasksDirty", false);
    }
}),

答案 1 :(得分:0)

Ember(2.x)不跟踪关系(例如hasMany),但可以使用几乎可以执行它的ember-addon ember-data-change-tracker。它允许您(自动)保存当前的关系状态,然后您可以比较这个已保存的' (=旧州)与当前状态。你必须自己找到差异。我的适配器的一个简单示例:

snapshot.hasMany('users').length <-- current count of relations
snapshot.record.savedTrackerValue('users').length <-- old count of relations