ExtJs 6 在 Ext.app.Controller 上存储配置不工作
ExtJs 6 stores config on Ext.app.Controller not working
我刚刚注意到 Ext.app.Controller 上的存储配置 http://docs.sencha.com/extjs/6.0/6.0.2-classic/#!/api/Ext.app.Controller-cfg-stores 没有查找
在正确的路径中(与视图配置相同)。
例如
Ext.define('MyApp.controller.Menu', {
extend: 'Ext.app.Controller',
stores: ['Menu']
...
});
这将查找
http://localhost/myapp/app/controller/store/Menu.js?_dc=20160607211025
注意控制器文件夹
而不是
一开始我以为这是我的一个项目特有的配置问题,但后来在另一个项目上得到了同样的结果。
我正在使用 ExtJs 6.02
我知道我可以使用完整的 class 名称,例如 MyApp.store.Menu,但是 getter 会非常难看。 (这发生在我刚刚升级的巨大代码库上,所以使用完整的 class 名称将是我最后的资源)。
有人遇到过这个问题吗?
我遇到过类似的问题,解决这个问题的方法是将我的应用程序需要的所有商店添加到 app/Application.js
.
中的 stores
配置中
我找到了原因(耐心等待):
https://docs.sencha.com/extjs/6.0/6.0.2-classic/source/Controller2.html#Ext-app-Controller
看:
onClassExtended -> Controller.resolveNamespace -> Ext.app.getNamespace
这些是重要的,一旦解析了名称空间,就会调用进程依赖项:
Controller.processDependencies(proto, requires, namespace, 'store', data.stores);
我对此进行了研究,Ext.app.getNamespace 在分机 5 和 6 中是相同的
那么为什么它在 ExtJs 5
Ext.getNamespace("MyApp.controller.SomeController"); // returns MyApp
和 ExtJs 6
Ext.getNamespace("MyApp.controller.SomeController"); // returns MyApp.controller
原因由console.log找到Ext.ClassManager.paths
现在有一个新条目对应MyApp.controller
之前 MyApp.controller (ZHT.controller)
没有密钥
而 Ext.getNameSpace 所做的是查找 'deepest prefix',如您在此处所见 http://docs.sencha.com/extjs/6.0/6.0.2-classic/source/Util.html#Ext-app-Util
[更新]
所以可以做的一件事是像这样覆盖静态方法 resolveNamespace:
statics: {
resolveNamespace: function(cls, data) {
var Controller = Ext.app.Controller,
namespaceRe = cls.prototype.isProfile ? Controller.profileRegex : Controller.controllerRegex,
className, namespace, match;
/*
* Namespace resolution is tricky business: we should know what namespace
* this Controller descendant belongs to, or model/store/view dependency
* resolution will be either ambiguous or plainly not possible. To avoid
* guessing games we try to look for a forward hint ($namespace) that
* Application class sets when its onClassExtended gets processed; if that
* fails we try to deduce namespace from class name.
*
* Note that for Ext.app.Application, Controller.onClassExtended gets executed
* *before* Application.onClassExtended so we have to delay namespace handling
* until after Application.onClassExtended kicks in, hence it is done in this hook.
*/
className = Ext.getClassName(cls);
namespace = data.$namespace || data.namespace ||
Ext.app.getNamespace(className) ||
((match = namespaceRe.exec(className)) && match[1]);
//<debug>
if (!namespace) {
Ext.log.warn("Missing namespace for " + className + ", please define it "+
"in namespaces property of your Application class.");
}
//</debug>
//This is the only change on this override.
//
if(namespace && namespace.indexOf(".controller") > -1) {
namespace = namespace.slice(0, namespace.indexOf(".controller"));
}
return namespace;
}
}
如果您知道更好的解决方案,请告诉我!
我刚刚注意到 Ext.app.Controller 上的存储配置 http://docs.sencha.com/extjs/6.0/6.0.2-classic/#!/api/Ext.app.Controller-cfg-stores 没有查找 在正确的路径中(与视图配置相同)。
例如
Ext.define('MyApp.controller.Menu', {
extend: 'Ext.app.Controller',
stores: ['Menu']
...
});
这将查找
http://localhost/myapp/app/controller/store/Menu.js?_dc=20160607211025
注意控制器文件夹
而不是
一开始我以为这是我的一个项目特有的配置问题,但后来在另一个项目上得到了同样的结果。
我正在使用 ExtJs 6.02
我知道我可以使用完整的 class 名称,例如 MyApp.store.Menu,但是 getter 会非常难看。 (这发生在我刚刚升级的巨大代码库上,所以使用完整的 class 名称将是我最后的资源)。
有人遇到过这个问题吗?
我遇到过类似的问题,解决这个问题的方法是将我的应用程序需要的所有商店添加到 app/Application.js
.
stores
配置中
我找到了原因(耐心等待):
https://docs.sencha.com/extjs/6.0/6.0.2-classic/source/Controller2.html#Ext-app-Controller
看:
onClassExtended -> Controller.resolveNamespace -> Ext.app.getNamespace
这些是重要的,一旦解析了名称空间,就会调用进程依赖项:
Controller.processDependencies(proto, requires, namespace, 'store', data.stores);
我对此进行了研究,Ext.app.getNamespace 在分机 5 和 6 中是相同的
那么为什么它在 ExtJs 5
Ext.getNamespace("MyApp.controller.SomeController"); // returns MyApp
和 ExtJs 6
Ext.getNamespace("MyApp.controller.SomeController"); // returns MyApp.controller
原因由console.log找到Ext.ClassManager.paths
现在有一个新条目对应MyApp.controller
之前 MyApp.controller (ZHT.controller)
没有密钥而 Ext.getNameSpace 所做的是查找 'deepest prefix',如您在此处所见 http://docs.sencha.com/extjs/6.0/6.0.2-classic/source/Util.html#Ext-app-Util
[更新] 所以可以做的一件事是像这样覆盖静态方法 resolveNamespace:
statics: {
resolveNamespace: function(cls, data) {
var Controller = Ext.app.Controller,
namespaceRe = cls.prototype.isProfile ? Controller.profileRegex : Controller.controllerRegex,
className, namespace, match;
/*
* Namespace resolution is tricky business: we should know what namespace
* this Controller descendant belongs to, or model/store/view dependency
* resolution will be either ambiguous or plainly not possible. To avoid
* guessing games we try to look for a forward hint ($namespace) that
* Application class sets when its onClassExtended gets processed; if that
* fails we try to deduce namespace from class name.
*
* Note that for Ext.app.Application, Controller.onClassExtended gets executed
* *before* Application.onClassExtended so we have to delay namespace handling
* until after Application.onClassExtended kicks in, hence it is done in this hook.
*/
className = Ext.getClassName(cls);
namespace = data.$namespace || data.namespace ||
Ext.app.getNamespace(className) ||
((match = namespaceRe.exec(className)) && match[1]);
//<debug>
if (!namespace) {
Ext.log.warn("Missing namespace for " + className + ", please define it "+
"in namespaces property of your Application class.");
}
//</debug>
//This is the only change on this override.
//
if(namespace && namespace.indexOf(".controller") > -1) {
namespace = namespace.slice(0, namespace.indexOf(".controller"));
}
return namespace;
}
}
如果您知道更好的解决方案,请告诉我!