【问题标题】:Reload invalid ember-data model重新加载无效的 ember-data 模型
【发布时间】:2014-06-10 11:07:06
【问题描述】:

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

我正在使用带有 ember-data 的 ember.js。

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 验证错误,它被添加到模型的错误中并标记为无效,然后错误显示在我的模板上。这一切都很好。然而, 在尝试保存()之后模型被标记为无效之后,如果我然后链接到另一条路线,让我们说 /show/id 来查看相同的模型。数据存储使用无效值检索无效模型,而不是获取新的有效模型。我试过做一个 rollback() onFail 像: 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-data 有足够的经验知道应该如何处理?

【问题讨论】:

    标签: ember.js ember-data


    【解决方案1】:

    在 Ember.Route (http://emberjs.com/api/classes/Ember.Route.html#method_deactivate) 上使用 deactivate 方法。在那里你可以检查模型是否无效,然后回滚记录。

    deactivate: function(){
      if(!this.model().get("isValid")){
        this.model().rollback();
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-26
      • 1970-01-01
      • 1970-01-01
      • 2013-01-02
      • 2016-06-29
      • 1970-01-01
      • 2013-11-22
      • 1970-01-01
      相关资源
      最近更新 更多