Ember.js 需要帮忙弄清楚这个余烬卸载程序是做什么的吗

Ember.js 需要帮忙弄清楚这个余烬卸载程序是做什么的吗,ember.js,routes,ember-data,Ember.js,Routes,Ember Data,我现在有一条路线,当我转换回它时,给了我一个很大的错误,堆栈跟踪不能帮助我找出哪里出了问题 处理路由时出错:project.details断言失败:对已销毁对象调用集错误:断言失败:调用集 论被毁物 新错误时(本机) at Error.EmberError() 在Object.Ember.default.assert()处 在Object.set()处 在exports.default.mixin.mixin.create.set()处 在Ember.Object.extend.flushCan

我现在有一条路线,当我转换回它时,给了我一个很大的错误,堆栈跟踪不能帮助我找出哪里出了问题

处理路由时出错:project.details断言失败:对已销毁对象调用集错误:断言失败:调用集 论被毁物 新错误时(本机) at Error.EmberError() 在Object.Ember.default.assert()处 在Object.set()处 在exports.default.mixin.mixin.create.set()处 在Ember.Object.extend.flushCanonical()处 在余烬$data$lib$system$relations$state$上有许多$$ManyRelationship.flushCanonical () 在Queue.invoke()处 在Object.Queue.flush()处 在Object.DeferredActionQue

通过浏览我的路线并发表评论,我在我的项目中发现了这一点路线:

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');
  });
*/
然后错误消失了,转换成功了。这段代码是由其他人编写的,我认为这与从存储中刷新模型有关,但我不明白为什么它会导致“对已销毁对象的调用集”错误


任何帮助都将不胜感激。

乍一看,这条路线似乎既服务于单个项目参数(指定了q),也服务于所有项目,乍一看,对于ember来说,这远远不是完美的设计。理想情况下,您应该有两条路线-项目路线和项目路线。那是在余烬建筑方面

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

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

或者干脆把它注释掉(我认为把它注释掉应该对你有用).

有一点是因为它没有从存储中提取内容,因此需要卸载/重新加载。至于你的另一点,我确实有一个单一的
project
路由,但是这个projects路由返回一个默认的项目列表,并且在该页面上有一个搜索框,它设置了查询,它返回一个与应用程序接口不同的项目列表ch查询,所以它仍然是多个项目包装器也会导致同样的错误。我不确定,它不从商店取回东西意味着什么?为什么每次你都要卸载和重新装载?这真的毫无意义。我的记忆显然很短:这就是为什么我首先要这么做的原因。我的建议听起来很奇怪你永远不会清除所有的本地存储和重新加载,而是派生出另一条路径(顶级)/有一个偶尔运行一次的后台服务并整理旧记录,卸载和重新加载似乎是一个非常糟糕的设计..IMO