Ext.getStore()快捷方式?

时间:2013-07-18 17:25:41

标签: javascript extjs4 extjs4.2

是否有已知的快捷方式在代码中引用商店?

我一直在使用Ext.getStore('MyStore'),但现在意识到这不是最好的做法,因为当商店的ID被更改时,你必须通过代码重新编辑每次提及它。

作为一个快速而肮脏的解决方案,我想将它存储在app init的变量中:

App.MyStore = Ext.getStore('MyStore');

然后将该变量引用为

App.MyStore.load();

如果有一种已知的更好方法,我只是好奇。

2 个答案:

答案 0 :(得分:2)

在我的应用程序中,我通常添加注射剂。 有一个“配置类”来保存存储(用Ext.getStore(“...”);声明),它将存储注入需要它的组件/控制器。

这样,如果您需要重命名某些内容或更改商店,例如在控制器中,您只需要更改配置类,而不再需要更改。

修改

所以你会有一个可以看起来像

的“配置”类
beans: [
    {
       className : "MyApp.store.myStore",
       ref: "myStore"
    },
    {
       value: "some string value",
       ref: "myValue"
    }],

mapping: [
     {
         className: "MyApp.controller.MyController",
         references:
         [
           "myStore",
           "myValue"
         ]
     },
     {
         className: "MyApp.controller.someOtherController",
         references:
         [
            "myStore"
         ]
     }
]

然后你会写另一个“注入”类,它使用这个配置通过 ref 值将“beans”注入其他类。

这里的优点是你可以将myStore引用的className更改为其他类,并且所有注入的类都有一个 new 类的实例。

例如,假设您此时只是将商店注入控制器,而不是其他任何内容。

您可以使用如下方法编写另一个控制器类: (假设你有一个对你的配置类的引用 - this.config)

injectStores: function()
{
    //get the mapping
    var mapping = this.config.mapping;

    //go over every item in the mapping
    for(var k in mapping){ 

        //this makes the code a little easier to write
        var ref = mapping[k];

        //get the controller you will inject stores in
        var controller = this.getController(ref.className); 

        //loop over all of the references
        for(var j in ref.references){  

           //use the helper method to get the correct store name 
           var storeName = this._getBean(ref.references[j].className);
           //and then use Extjs' method to get the store instance
           var store = this.getStore(storeName); 

           //add a reference to the store in your controller
           controller[j] = store; 
        }
    }

},

_getBean: function(beanName)
{
   //reference the beans array
   var beans = this.config.beans;

   //loop over every bean
   for(var i in beans)
   {
      //if the names match return the bean
      if(beans[i].ref === beanName)
      { 
         return beans[i];
      }
   }
   //no matches, so return null;
   //this shouldn't happen when the mapping is correct
   return null;
}

这是一个例子,我没有写出使这项工作所需的所有检查。 例如,当遇到第二个bean中的“value”属性时,此代码将失败。但是你可以轻松编写一些代码来处理不同的代码。

同样,这是代码只是作为将存储注入控制器的示例。 在此示例中,您应该能够执行:

this.getController("MyApp.controller.MyController").myStore.load();

如果注射工作正常。

我希望这可以作为帮助你的起点; - )

答案 1 :(得分:0)

我建议你试试deftjs.org

  

DeftJS增强了Ext JS和Sencha Touch的API   构建块使大型开发团队能够快速构建   企业级应用程序,利用最佳实践并经过验证   顶级RIA开发人员发现的最佳模式   行业咨询公司。

还要确保使用MVC模式,然后您可以非常轻松地从控制器中引用您的视图,存储或字段:

var me = this,
    view = me.getView(),
    store = view.getStore(),
    record = view.getRecord(),
    data = record.getData(),
    field = me.getMyCustomField();