需要帮助搞清楚这个Ember unloadAll会做什么

时间:2015-10-15 17:07:51

标签: ember.js routes ember-data

我有这条路线,目前,当我转换回它时,给了我一个很大的错误,堆栈跟踪并没有帮助我弄清楚出了什么问题。

  

处理路由时出错:project.details断言失败:在销毁对象上调用set错误:断言失败:调用集   在被摧毁的物体       在新错误(本机)       在Error.EmberError(http://starqa.fmr.com/assets/vendor.js:22615:21)       at Object.Ember.default.assert(http://starqa.fmr.com/assets/vendor.js:15716:13)       在Object.set(http://starqa.fmr.com/assets/vendor.js:26367:22)       at 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)       at Object.Queue.flush(http://starqa.fmr.com/assets/vendor.js:11490:13)       在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');
  });
*/

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

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

看起来这条路线似乎同时服务于单个项目参数(指定了q)和所有项目,其中的副手听起来远非完美的余烬设计。理想情况下,您应该有两条路线 - 项目和项目路线。这是在Ember架构方面。

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

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

或者只是将其注释掉(我认为留下评论应该适合你)。