2015-11-10 15 views
0

我面临一个问题,我的控制器refs和返回的对象无效。并且通过无效,它返回一个对象,表示它即使在我正在使用它的过程中也没有被渲染。控制器返回未呈现的视图

在我的控制器中,我有一个ref,定义如下。

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

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

this.getSelectDeltaView()

什么奇怪的是,在第一时间这一观点被提出,一个Ext.Window里面只是正常访问此视图。但是,在第二次启动时,我得到的视图不会呈现。

this.getSeletDeltaView().rendered === false

阅读该文档了在煎茶看来,这只是将我的选择到Ext.ComponentQuery.query功能。但是,如果我拨打Ext.ComponentQuery.query('[itemId=selectDeltaView]'),我会得到一个数组,其中呈现的是单个元素。

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

更新

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

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

+0

如果一个缓存视图不再存在,'refs'将不会返回它,但找到新的视图。我认为还有其他事情正在发生。 –

回答

1

控制器引用在第一次评估后被缓存。

会发生什么情况是这样的:

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

解决方案:

确保destroy()你的看法,当你隐藏它。您也可以使用autoDestroy作为属性。通常,autoDestroy默认为true。

+0

我投了你的回应,因为这正是我所走的路。然而,在我的'Ext.window.Window'我有'autoDestroy:true',并且我已经添加了日志语句到我的视图'beforedestroy'和'ondestroy',并且两个都在我关闭窗口时触发。 – Freddy