1

我正在将我当前的应用程序从 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. 用户单击 UI 并正确显示视图 A。
  2. 用户单击其他 UI 项目,它也正确显示视图 B。
  3. 用户单击第一个 UI 项目并尝试显示视图 A,但它没有。在深入查看视图属性后,我意识到它的状态变为“已销毁”。

这是正常行为吗?我检查了 1.0pre 更新日志和与视图状态相关的不同帖子,但我看不到任何类似的东西。

提前致谢!

PS:我认为这里的代码无关紧要,如果您想让我发布更多代码,请告诉我。

4

1 回答 1

0

好吧,我不知道 0.9.8 和 1.0-pre 之间到底添加了什么,但我认为已经做了一些工作以避免内存泄漏。然后正如你所说,从containerView中删除时,视图似乎被破坏了。我找到的解决方案是在每次需要时创建视图。我认为这不是最佳解决方案。我会尝试做得更好,尤其是通过使用childViews.Ember.ContainerView

这是非常接近您的实现:

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');​

更新

由于这对你不起作用,对于 1.0 版本,我认为实现它的首选方法是使用outlets. 在这里,有一个很好的例子来说明它是如何实现的:emberjs - how to mark active menu item using router infrastructure

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

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

于 2012-08-15T09:53:49.290 回答