ContainerViews的重点是什么? (断言失败:在被破坏的对象上调用set)

时间:2014-05-22 15:51:12

标签: ember.js

所有

我一直在寻找答案,但尚未找到一个好的解释和解决方案。希望你能提供帮助。

我有一个呈现Ember.ContainerView的路径(而不是标准的Ember.View)。当我离开这条路线然后回到它(通过后退按钮,链接助手或只是更改网址)时,我在控制台中收到以下错误:

Uncaught Error: Assertion Failed: calling set on destroyed object

我理解这是一个很高级别的原因,当我们使用ContainerView从路径转换时,它的childViews被标记为已销毁。当我们转换回路线时,问题与Ember试图将childViews设置回被破坏的实例有关。

我不完全清楚,但这是我目前的模糊理解。

所以,我的问题如下:

  1. 如果不正确,请您纠正我对此问题的理解吗?
  2. 您能否告诉我如何解决此错误?
  3. 为方便起见,我为您的观看乐趣创建了JSBin example。要复制错误,请打开JS控制台,单击Go to Route two链接,然后单击Go to index链接。现在检查你的日志。

    提前感谢您提供的任何帮助。

2 个答案:

答案 0 :(得分:3)

以下是修正:http://jsbin.com/jumoy/1/edit?html,css,js,output

之前我遇到过这个问题。我不能说我在非常详细的层面上真正理解它,但这是一般性问题。在定义容器视图时,它实际上是在定义子视图时创建的,而不是在创建视图实例时。这意味着您的子视图“初始”仅被创建一次,这就是当文件被初始化解析并且定义了ContainerView时。当ember清理这个子视图时,它永远不会消失,'initial'将始终等于清理后的视图。

通过将“initial”设置为属性,每次呈现容器视图的新实例时都会创建它,因此将创建并访问新的子视图。

故事的道德,尽量不要在控制器/视图的定义中创建对象。而是创建返回该对象创建的属性。

希望这有帮助并且有意义。

UPDATE ::

我已经编辑了jsbin,以更深层次地向您展示正在发生的事情以及它无法正常工作的原因。要查看效果取消注释第二个ContainerView并注释掉第一个,您将在控制台日志中注意到第二次转到twoRoute时,它已将该初始属性标记为state:销毁该视图。

http://jsbin.com/jumoy/2/edit?html,js,output

答案 1 :(得分:2)

如果您使用.hidden { display:none;} 命名空间发布您的活动,Ember.Instrumentation在您的代码中使用<{1}},当您发布活动时,它会堆叠所有订阅者并在他们发送时调用它们被毁了。

所以基本上,例如当您的路由被销毁时正在运行订阅语句时,它将失败并给出上述错误。

以下是此问题的解决方案:使用Ember.subscribe删除以前被销毁的订阅者。这个解决方案帮助我进行了验证测试,其中app在测试完成后被销毁。 我在Ember.Instrumentation.reset()的{​​{1}}函数中写了Ember.Instrumentation.reset()并且它有效。

希望有所帮助。