2016-06-09 49 views
5

Tôi chỉ nhận thấy rằng cửa hàng cấu hình http://docs.sencha.com/extjs/6.0/6.0.2-classic/#!/api/Ext.app.Controller-cfg-stores trên Ext.app.Controller không tìm kiếm trong đường dẫn bên phải (xảy ra cùng với cấu hình lượt xem).ExtJs 6 cửa hàng cấu hình trên Ext.app.Controller không làm việc

ví dụ

Ext.define('MyApp.controller.Menu', { 
    extend: 'Ext.app.Controller', 
    stores: ['Menu'] 
... 
}); 

này sẽ tìm kiếm

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

thông báo thư mục controller

thay vì

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

Vào đầu tôi nghĩ đây là một vấn đề cấu hình cụ thể cho một dự án của tôi, nhưng sau đó đã được điều tương tự trên một dự án khác nhau.

Tôi đang sử dụng ExtJs 6,02

Tôi biết tôi có thể sử dụng tên lớp đầy đủ như MyApp.store.Menu nhưng sau đó các getter sẽ rất xấu xí. (Điều này xảy ra trên một cơ sở mã lớn mà tôi vừa nâng cấp để sử dụng tên lớp đầy đủ sẽ là tài nguyên cuối cùng của tôi).

Có ai đó đã gặp sự cố này không?

+0

Bạn có yêu cầu các cửa hàng trong bộ điều khiển của mình không? Ví dụ này cho thấy cần thiết: [Ext.app.Controller # cfg-stores] (http://docs.sencha.com/extjs/6.0.2-classic/Ext.app.Controller.html#cfg-stores). –

+0

cửa hàng: ['Menu'] nên là tất cả những gì bạn cần –

Trả lời

2

tôi đã tìm thấy lý do (trần với tôi):

https://docs.sencha.com/extjs/6.0/6.0.2-classic/source/Controller2.html#Ext-app-Controller

xem:

onClassExtended -> Controller.resolveNamespace -> Ext.app.getNamespace

Đó là những điều quan trọng, khi không gian tên được giải quyết, có một cuộc gọi để xử lý các phụ thuộc:

Controller.processDependencies(proto, requires, namespace, 'store', data.stores); 

tôi nghiên cứu này và Ext.app.getNamespace là giống hệt nhau trong ext 5 và 6

vậy tại sao là nó trong ExtJs 5

Ext.getNamespace("MyApp.controller.SomeController"); // returns MyApp

và trên ExtJs 6

Ext.getNamespace("MyApp.controller.SomeController"); // returns MyApp.controller

Lý do được tìm thấy bởi bảng điều khiển.đăng nhập Ext.ClassManager.paths bây giờ có một entry mới tương ứng với MyApp.controller

enter image description here

trước đây không có chìa khóa cho MyApp.controller (ZHT.controller)

Và những gì Ext.getNameSpace không được tìm kiếm ' prefix sâu nhất' như bạn có thể thấy ở đây http://docs.sencha.com/extjs/6.0/6.0.2-classic/source/Util.html#Ext-app-Util

[cập nhật] vì vậy, một điều mà có thể được thực hiện là để ghi đè lên các phương pháp resolveNamespace tĩnh như thế này:

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; 
     } 
    } 

Nếu bạn biết giải pháp tốt hơn, vui lòng cho tôi biết!

+0

Cửa hàng có 'storeId' không? Điều đó có thể giúp .. –

+0

Không phải tất cả các trường hợp đều có nó, cộng với Nếu tôi chuyển sang sử dụng storeId để tham chiếu các cửa hàng, tôi sẽ mất các getters đã được sử dụng, nhưng cảm ơn đề xuất. –

0

Tôi đã gặp các sự cố tương tự và cách giải quyết vấn đề này là thêm tất cả các cửa hàng mà ứng dụng của tôi yêu cầu vào cấu hình stores trong app/Application.js.

+0

Thậm chí nếu tôi yêu cầu lưu trữ trên Application.js tôi vẫn cần phải giữ cấu hình cửa hàng trong bộ điều khiển để tôi có thể sử dụng trình thu thập thích hợp được tự động phát. http://docs.sencha.com/extjs/6.0/6.0.2-classic/#!/api/Ext.app.Controller-cfg-stores –

Các vấn đề liên quan