0

代码中是否有已知的引用存储的快捷方式?

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

作为一个快速而肮脏的解决方案,我正在考虑将它存储在应用程序初始化的变量中:

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

然后将该变量引用为

App.MyStore.load();

我只是好奇是否有更好的方法。

4

2 回答 2

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值将“bean”注入其他类。

这里的优点是您可以将 myStore 引用的 className 更改为其他内容,并且所有注入的类都将具有类的实例。

例如,假设您此时只是将商店注入控制器,没有别的。

你可以用这样的方法编写另一个控制器类:(假设你有一个对你的配置类的引用——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 中的“值”属性时,此代码将失败。但是你可以很容易地编写一些代码来以不同的方式处理它。

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

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

如果注射工作正常。

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

于 2013-07-19T05:46:22.657 回答
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();
于 2013-07-19T10:14:36.050 回答