控制器返回未渲染的视图

时间:2015-11-10 03:41:03

标签: extjs extjs4.2

我遇到控制器refs的问题,并且返回的对象无效。并且通过无效,它返回一个对象,表示即使我正在使用它,它也没有被渲染。

在我的控制器中,我将ref定义如下。

refs : [ {
        ref : 'selectDeltaView',
        selector : '[itemId=selectDeltaView]'
    }]

以后在我的控制器中,我使用创建的访问器

访问此视图

this.getSelectDeltaView()

奇怪的是,第一次显示此视图时,在Ext.Window内部工作正常。但是,在第二次启动时,我回来的视图不会被渲染。

this.getSeletDeltaView().rendered === false

在Sencha上阅读文档似乎只是将我的选择器传递给Ext.ComponentQuery.query函数。但是,如果我调用Ext.ComponentQuery.query('[itemId=selectDeltaView]'),我会得到一个数组,其中包含一个呈现为真的单个元素。

我错过了什么吗?为什么我的控制器引用了返回无效数据。

更新

原帖中未提及的其他一些细节。我最初的假设是我的观点没有被破坏。但是,我在ondestorybeforedestory事件中有日志语句,并且可以确认在关闭窗口时我的视图正在被销毁。

最令人困惑的是,如果refs只使用Ext.ComponentQuery.query,为什么Ext.ComponentQuery.query仅在重新打开窗口时返回一个视图并返回正确的视图。我从下面的问题中了解到refs将捕获视图,但该视图不再存在..或者不应该......如果视图被破坏,我可以强制控制器清除它的捕获吗?

1 个答案:

答案 0 :(得分:1)

在第一次评估后缓存控制器参考。

这是怎么回事:

  • 您第一次打开视图。
  • getSeletDeltaView()找到该视图,并在引用查找缓存中存储对它的引用。
  • 您关闭视图,但不要完全销毁它。
  • 您第二次打开视图,但它是一个不同的实例。
  • getSeletDeltaView()找到第一个视图,该视图不再呈现,但仍然存在,因为它没有被销毁。您不能使用此引用,因为它指向错误的视图。

解决方案:

隐藏它时,请确保destroy()您的视图。您还可以使用autoDestroy作为财产。通常,autoDestroy默认为true。