5

我有文件清单。每个文档都有由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 的插件/mixin。

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

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

4

2 回答 2

0

已经有一段时间了。对于has-man,我使用这个解决方案。如果用户更改与以前相同的项目组具有多关系,则“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);
    }
}),
于 2017-10-27T14:32:31.617 回答
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
于 2017-11-30T12:40:03.650 回答