当从容器视图(1.0pre)退出时,视图将其状态更改为“已销毁”

时间:2012-08-14 17:36:00

标签: ember.js

我正在从0.9.8将我当前的应用程序更新到1.0pre,我正在尝试一些我无法理解的东西。

我的一个模板有一个绑定到属性的容器视图:

...
{{view Ember.ContainerView currentViewBinding="oTabPanelFrame"}}
...

然后我通过代码执行类似这样的操作来改变容器的视图(由观察者执行的代码):

...
if (sender[key])
    this.set('oTabPanelFrame', sender.get('oFrameView'));
...

由于1.0pre只能运行一次,第二次尝试设置视图时,其状态变为“已销毁”(在0.9.8中始终为“preRender”),然后它不再显示。

所以,这就是:

  1. 用户点击用户界面并正确显示视图A.
  2. 用户点击其他UI项目,它也会正确显示视图B.
  3. 用户点击第一个UI项目并尝试显示视图A,但事实并非如此。潜入视图属性后,我意识到它的状态变为'已被破坏'。
  4. 这是正常的行为吗?我检查了1.0pre更改日志以及与视图状态相关的不同帖子,但我看不到任何类似的内容。

    提前致谢!

    P.S。:我认为代码与此无关,如果您希望我发布更多代码,请告诉我。

1 个答案:

答案 0 :(得分:0)

好吧,我不知道在0.9.8和1.0-pre之间究竟有什么附加,但我认为已经做了一些工作以避免内存泄漏。然后如你所说,从containerView中删除视图似乎被销毁。 我发现的解决方案是每次需要时创建视图。我认为这不是最佳解决方案。我会尝试做得更好,特别是使用childViews的{​​{1}}属性。

这是非常接近你的实现:

Ember.ContainerView

<强> 更新

由于这对您不起作用,对于1.0版本,我认为实现此目的的首选方法是使用Test = Ember.Application.create(); Test.TabPanel = Ember.View.extend({ templateName: 'tabpanel', tagName: 'span', init: function() { this._super(); this.set('oTabPanelFrame', Ember.View.create()); }, click1: function(event) { event.context.set('oTabPanelFrame', event.context.get('view1').create()); }, click2: function(event) { event.context.set('oTabPanelFrame', event.context.get('view2').create()); }, view1: Ember.View.extend({ defaultTemplate: Ember.Handlebars.compile("View1's contents") }), view2: Ember.View.extend({ defaultTemplate: Ember.Handlebars.compile("View2's contents") }), }); var oMyPanel = Test.TabPanel.create(); oMyPanel.appendTo('#content');​ 。 这里有一个很好的例子:emberjs - how to mark active menu item using router infrastructure

我修改了小提琴,向您展示切换视图时如何保持状态。实际上,当视图“连接”时,它们每次都会被实例化。但是状态应该保留在控制器或模型中。

这是小提琴:http://jsfiddle.net/Sly7/z8ssG/11/