代码中是否有已知的引用存储的快捷方式?
我一直在使用Ext.getStore('MyStore')
,但现在意识到这不是最佳做法,因为当商店的 ID 更改时,您必须通过代码重命名每次提及它。
作为一个快速而肮脏的解决方案,我正在考虑将它存储在应用程序初始化的变量中:
App.MyStore = Ext.getStore('MyStore');
然后将该变量引用为
App.MyStore.load();
我只是好奇是否有更好的方法。
代码中是否有已知的引用存储的快捷方式?
我一直在使用Ext.getStore('MyStore')
,但现在意识到这不是最佳做法,因为当商店的 ID 更改时,您必须通过代码重命名每次提及它。
作为一个快速而肮脏的解决方案,我正在考虑将它存储在应用程序初始化的变量中:
App.MyStore = Ext.getStore('MyStore');
然后将该变量引用为
App.MyStore.load();
我只是好奇是否有更好的方法。
在我的应用程序中,我通常添加注入。有一个“配置类”保存存储(用 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();
如果注射工作正常。
我希望这可以作为一个起点来帮助你;-)
我建议你试试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();