5

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

コントローラーフォルダーに注意してください

それ以外の

http://localhost/myapp/app/store/Menu.js?_dc=20160607211025

最初は、これは自分のプロジェクトの 1 つに固有の構成の問題だと思っていましたが、別のプロジェクトでも同じことが起こりました。

ExtJs 6.02 を使用しています

MyApp.store.Menu のような完全なクラス名を使用できることはわかっていますが、ゲッターは非常に醜いものになります。(これは、アップグレードしたばかりの巨大なコードベースで発生しているため、完全なクラス名を使用するのは最後のリソースになります)。

誰かがこの問題に直面しましたか?

4

2 に答える 2

2

私は理由を見つけました(我慢してください):

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はext 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 が行うことは、ここで確認できるように「最も深いプレフィックス」を探すことですhttp://docs.sencha.com/extjs/6.0/6.0.2-classic/source/Util.html#Ext-app-Util

[更新] できることの 1 つは、静的メソッド 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.
            //http://stackoverflow.com/questions/37731213/extjs-6-stores-config-on-ext-app-controller-not-working/37733261#37733261
            if(namespace && namespace.indexOf(".controller") > -1) {
                namespace = namespace.slice(0, namespace.indexOf(".controller"));
            }

            return namespace;
        }
  }

より良い解決策を知っている場合は、私に知らせてください!

于 2016-06-09T18:08:27.253 に答える
0

私は同様の問題に直面しており、これを解決する方法は、アプリケーションが必要とするすべてのストアを の構成に追加することでしstoresapp/Application.js

于 2016-06-09T16:33:38.337 に答える