首页 文章

重新加载无效的ember-data模型

提问于
浏览
0

这与这个问题非常相似Force reload of dirty/invalid model in Ember

我正在使用ember.js和ember-data .

DEBUG: ------------------------------- ember.js?compile=false:3521
DEBUG: Ember      : 1.5.0 ember.js?compile=false:3521
DEBUG: Ember Data : 1.0.0-beta.7+canary.e3b896bc ember.js?compile=false:3521
DEBUG: Handlebars : 1.3.0 ember.js?compile=false:3521
DEBUG: jQuery     : 1.11.0 ember.js?compile=false:3521
DEBUG: -------------------------------

服务器返回422,其中包含对验证错误的错误响应,这会将错误添加到模型的错误中并标记为无效,然后错误会显示在我的模板上 . 一切正常 . 但是,在尝试save()之后模型被标记为无效之后,如果我然后链接到另一条路径,那么让我们说/ show / id来查看相同的模型 . 数据存储使用无效值检索无效模型,而不是获取新的有效模型 . 我尝试过onFail上的rollback():group.save() . then(onSuccess,onFail);并且回滚工作,但它也清除模型错误并刷新模板,以便用户永远不会看到验证错误 . 我想要的是显示验证错误以及链接是否发生另一条路线;从那里,具有无效状态的模型不应再从数据存储中拉出,而是再次从服务器中拉出 . 我目前获得有效模型的唯一方法是重新加载整个页面 .

我也尝试使用路由器中的模型挂钩强制重新加载,但这似乎会导致错误:

Ricauth.GroupShowRoute = Ember.Route.extend({
    model: function(params) {
        var group = this.store.find('group', params.id);
        group.reload(); // doesn't work, causes error
        return group;
    },
    setupController: function(controller, group) {
        controller.set('model', group);
        controller.set('readOnly', true);
        controller.set('meta', Ember.copy(this.store.metadataFor("group")))
    }
});

无论如何,这实际上并不是一个好方法,因为每次请求ShowRoute时我都在重新加载模型 . 我也尝试检查group.isValid,但是那时它是未定义的 . 关于如何重新加载并且仅在模型无效时的任何想法?

我使用onFail和unloadRecord()找到了合理的解决方案 . unloadRecord将从数据存储区中删除记录,以便商店在下次查询此记录时从服务器检索 . 我的更新动作

actions: {
    update: function (group) {
        var self = this;
        var onSuccess = function(group) {
            console.info("save: "+group);
            self.transitionTo('group.show', group);
        };
        var onFail = function(error) {
            console.info("failed: "+error.message);
            group.unloadRecord();
        };
        if(group.get('currentState').stateName == 'root.loaded.updated.uncommitted') {
            group.save().then(onSuccess, onFail);
        }
        else {
            onSuccess(group);
        }
    }
}

因此,当卸载确实从数据存储中删除记录时,它会进入状态“root.deleted.saved” . 从这种状态来看,由于ember数据状态管理器的工作方式,我似乎无法保存记录 . 在这一点上,我只是很难理解为什么我不能做出如此概念上简单的工作 . 有没有其他人有足够的使用ember数据的经验来知道如何处理它?

1 回答

相关问题