我正在从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.0pre更改日志以及与视图状态相关的不同帖子,但我看不到任何类似的内容。
提前致谢!
P.S。:我认为代码与此无关,如果您希望我发布更多代码,请告诉我。
答案 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
我修改了小提琴,向您展示切换视图时如何保持状态。实际上,当视图“连接”时,它们每次都会被实例化。但是状态应该保留在控制器或模型中。