【问题标题】:Need help figuring out what this Ember unloadAll does需要帮助弄清楚这个 Ember unloadAll 的作用
【发布时间】:2015-10-15 17:07:50
【问题描述】:

我目前有一条路线,当我转换回它时,它会给我一个很大的错误,堆栈跟踪无法帮助我找出问题所在。

处理路由时出错:project.details 断言失败:在已销毁对象上调用 set 错误:断言失败:调用 set 在被破坏的物体上 在新的错误(本机) 在 Error.EmberError (http://starqa.fmr.com/assets/vendor.js:22615:21) 在 Object.Ember.default.assert (http://starqa.fmr.com/assets/vendor.js:15716:13) 在 Object.set (http://starqa.fmr.com/assets/vendor.js:26367:22) 在exports.default.mixin.Mixin.create.set (http://starqa.fmr.com/assets/vendor.js:41034:20) 在 Ember.Object.extend.flushCanonical (http://starqa.fmr.com/assets/vendor.js:69769:14) 在 ember$data$lib$system$relationships$state$has_many$$ManyRelationship.flushCanonical (http://starqa.fmr.com/assets/vendor.js:71525:22) 在 Queue.invoke (http://starqa.fmr.com/assets/vendor.js:11425:18) 在 Object.Queue.flush (http://starqa.fmr.com/assets/vendor.js:11490:13) 在 Object.DeferredActionQue

通过浏览我的路线并注释掉一些东西,我在我的 projects 路线中发现了这一点:

export default Ember.Route.extend(AuthenticatedRouteMixin, {
  model: function(params) {
    if (params.q) {
      return this.store.find('project', params);
    } else {
      var _this = this;
      Ember.run(function() {
        _this.store.unloadAll('project');
      });
      return this.store.findAll('project', {reload: true});
    }
  }

如果我注释掉第 7-9 行:

/*
  Ember.run(function() {
    _this.store.unloadAll('project');
  });
*/

然后错误消失并且转换工作。这段代码是由其他人编写的,我认为它与从商店中刷新模型有关,但我无法弄清楚为什么它会导致这个“调用集在被破坏的对象”错误。

任何帮助将不胜感激。

【问题讨论】:

    标签: ember.js routes ember-data


    【解决方案1】:

    看起来这条路线既服务于单个项目参数(指定了 q)也服务于所有项目,这听起来远非完美的 ember 设计。理想情况下,您应该有两条路线——项目路线和项目路线。那是在 Ember 架构方面。

    在功能方面,当您的对象被 ember 释放但您再次尝试访问它时,就会发生这种情况。我怀疑这是在 Ember.run 中发生的,在另一个循环中运行卸载,而我认为这不是所需要的。尝试从 ember 循环中删除 unload all ,或者大多数情况下你可以在没有它的情况下运行(为什么每次调用路由时都想删除当前缓存中的所有对象?

    this.store.unloadAll('project');
    return this.store.findAll('project', {reload: true});
    

    或者只是把它注释掉(我认为把它注释掉应该对你有用)。

    【讨论】:

    • 它没有从商店拉回东西,因此卸载/重新加载。对于您的另一点,我确实有一个单一的project 路由,但是这个项目路由返回一个默认的项目列表,并且在该页面上是一个搜索框,它设置查询,它从 API 返回一个不同的项目列表匹配查询,所以它仍然是多个项目。
    • 同样取出 Ember.run() 包装器也会导致同样的错误。
    • 我不确定,不把东西从商店里拉回来是什么意思?为什么每次到达路线时都想卸载和重新加载?这毫无意义,真的..
    • 我的记忆显然很短:my own question 是我首先需要这样做的原因。
    • 好吧,这听起来很奇怪,我建议你永远不要清除所有本地存储并重新加载,而是派生另一条路线(顶级)/有一个不时运行的后台服务,并且修剪旧记录,卸载和重新加载似乎是一个非常糟糕的设计..IMO
    猜你喜欢
    • 2013-11-21
    • 1970-01-01
    • 2020-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-16
    • 2021-03-03
    • 1970-01-01
    相关资源
    最近更新 更多