所有
我一直在寻找答案,但尚未找到一个好的解释和解决方案。希望你能提供帮助。
我有一个呈现Ember.ContainerView的路径(而不是标准的Ember.View)。当我离开这条路线然后回到它(通过后退按钮,链接助手或只是更改网址)时,我在控制台中收到以下错误:
Uncaught Error: Assertion Failed: calling set on destroyed object
我理解这是一个很高级别的原因,当我们使用ContainerView从路径转换时,它的childViews
被标记为已销毁。当我们转换回路线时,问题与Ember试图将childViews
设置回被破坏的实例有关。
我不完全清楚,但这是我目前的模糊理解。
所以,我的问题如下:
为方便起见,我为您的观看乐趣创建了JSBin example。要复制错误,请打开JS控制台,单击Go to Route two
链接,然后单击Go to index
链接。现在检查你的日志。
提前感谢您提供的任何帮助。
答案 0 :(得分:3)
以下是修正:http://jsbin.com/jumoy/1/edit?html,css,js,output
之前我遇到过这个问题。我不能说我在非常详细的层面上真正理解它,但这是一般性问题。在定义容器视图时,它实际上是在定义子视图时创建的,而不是在创建视图实例时。这意味着您的子视图“初始”仅被创建一次,这就是当文件被初始化解析并且定义了ContainerView时。当ember清理这个子视图时,它永远不会消失,'initial'将始终等于清理后的视图。
通过将“initial”设置为属性,每次呈现容器视图的新实例时都会创建它,因此将创建并访问新的子视图。
故事的道德,尽量不要在控制器/视图的定义中创建对象。而是创建返回该对象创建的属性。
希望这有帮助并且有意义。
UPDATE ::
我已经编辑了jsbin,以更深层次地向您展示正在发生的事情以及它无法正常工作的原因。要查看效果取消注释第二个ContainerView并注释掉第一个,您将在控制台日志中注意到第二次转到twoRoute时,它已将该初始属性标记为state:销毁该视图。
答案 1 :(得分:2)
如果您使用.hidden { display:none;}
命名空间发布您的活动,Ember.Instrumentation
在您的代码中使用<{1}},当您发布活动时,它会堆叠所有订阅者并在他们发送时调用它们被毁了。
所以基本上,例如当您的路由被销毁时正在运行订阅语句时,它将失败并给出上述错误。
以下是此问题的解决方案:使用Ember.subscribe
删除以前被销毁的订阅者。这个解决方案帮助我进行了验证测试,其中app在测试完成后被销毁。
我在Ember.Instrumentation.reset()
的{{1}}函数中写了Ember.Instrumentation.reset()
并且它有效。
希望有所帮助。