无法访问控制器内的正确范围

时间:2012-08-11 04:41:11

标签: extjs extjs4 extjs-mvc

我正在尝试根据服务器返回的数据动态构建表单。在这种情况下,我的商店没有<PROJECT NAME>/store文件夹。我在<PROJECT NAME>/store/admin中有。它的定义如下:

Ext.define('APP.store.admin.TaskOption', {
extend: 'Ext.data.Store',
autoLoad: false,
storeId: 'adminTasksOptions',
model: 'APP.model.admin.TaskOption',
sorters: [
    { property: 'order', direction: 'ASC' }
]
});

请注意storeId

现在在我的控制器中,我在init方法中尝试了这个,但它没有用(即:它没有调用taskOptionsLoaded方法。

      Ext.create('APP.store.admin.TaskOption');

      this.getAdminTasksOptionStore().on({
          scope: this,
          load : this.taskOptionsLoaded
      });

另请注意,当我执行断点并检查时,this.getAdminTaskOptionStore返回了正确的商店。我猜这是发生的,因为我把商店放在子文件夹中?不确定,但不是重新组织文件夹结构并将它们全部放在store文件夹中(我有大量的商店;大项目),我试图找到一个解决方案,这样我就可以保持文件有条理,这样很容易对于下一个人。

所以现在我尝试了这个,这也不起作用。这是在同一个控制器中的方法中执行的。

Ext.getStore('adminTasksOptions').load(
        {'params' : {'t_id' : this.selectedTaskTemplate},
        callback: function(store, records, success) {
            this.taskOptionsLoaded(store, records, success);
        }
    },this);

当我在this.taskOptionsLoaded行上断点时,它位于商店范围内,而不是控制器(this)范围内。

使用自己的storeId在商店中添加加载回调的最简洁方法是什么,并在控制器范围内执行方法?

希望这是有道理的。

2 个答案:

答案 0 :(得分:1)

如果你的控制器有一个配置stores: ['AdminTasksOptionStore'],它会生成一个名为getAdminTasksOptionStore()的getter。

storeIdadminTasksOptions的事实并不意味着ExtJS会在控制器中生成getter;但是,您可以Ext.data.StoreManager.lookup('adminTasksOptions')

你需要进入你的控制器:

stores: ['TaskOption'],

然后在您的控制器中,您将拥有getter getTaskOptionStore()

关于你的加载范围,你使用的是错误的变量,它应该是:

Ext.getStore('adminTasksOptions').load({
    scope: this,
    params: {'t_id' : this.selectedTaskTemplate},
    callback: function(store, records, success) {
        this.taskOptionsLoaded(store, records, success);
    }
});

答案 1 :(得分:0)

我认为您使用的on()功能错误了。试试这个:

this.getAdminTasksOptionStore().on(
  'load', // event
  this.taskOptionsLoaded, // handler
  this // scope
);