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

5

我有一个文档列表,每个文档都有由belongsTo定义的客户端属性。

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

在Ember 2.13中,DS.Model具有以下参数(https://emberjs.com/api/data/classes/DS.Model.html):

hasDirtyAttributes, dirtyType

它们两个都不会对Ember designbelongsTo / HasMany 的更改产生影响。我看到了许多关于这个话题的答案,但在2.13文档中我没有看到任何模型中的isDirty()方法,也没有任何手动设置文档模型为脏状态的.send("becomeDirty")方法?我还看到了几个适用于较旧的Ember版本的插件/ mixin。

但是我的问题是,Ember的创建者如何“建议/建议/最佳实践”来处理这个问题。是否有一些基本的方式/手动解决方案,而不需要任何第三方插件?例如,对于模型中的每个关系使用onchange观察器?或者使用@each.dirtyType为子相关模型创建计算属性(甚至可以将孩子设置为不会被标记为脏本身?)

在Ember 2.13中有哪些沙盒解决方案?

2个回答

0

已经过了一段时间。对于 has-many,我使用了这个解决方案。如果用户将 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);
    }
}),

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

1
你好,感谢信息。实际上hasMany很容易实现,并且在ember2中默认存储,你所需要的都在.currentState和.canonicalState中,就像我之前发布的另一篇帖子中提到的一样。但是BelongsTo让我遇到了更大的麻烦,我已经想出了一些适合我的项目的解决方案,但不像.hassMany那样坚实。我尝试了几个插件,主要问题是它们要求我在模型之外重写整个应用程序,而不是仅通过模型解决此问题,因为我认为这应该由模型本身完成,就像经典非关系字段的脏数据处理一样。 - Jiro Matchonson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接