9
Ext.define('DigitalPaper.controller.Documents', {
 extend: 'Ext.app.Controller',

 views:  ['Documents'],
 stores: ['Documents'],
 models: ['Documents'],

 init: function() {
     console.log('[OK] Init Controller: Documents');
 } 
});

获取此控制器的模型或视图的功能是什么?我试过了

  Ext.getModel('Documents');
  this.getModel('Documents');
  this.getModel();
  this.getDocumentsModel();

有什么建议吗?

4

4 回答 4

9

找到的解决方案:

In the Controller it is possible to use the reference to the View:

refs: [{
    ref: 'viewDocuments', // will be create the method this.getViewDocuments();
    selector: 'Documents'
}],

So you can get the View with this:

this.getViewDocuments();
于 2012-07-02T09:26:56.913 回答
7

Ext 控制器很奇怪,因为给定控制器只有一个实例,不管你有多少相关的视图实例。在大多数 MVC 或 MVP 系统中,每个视图实例都有一个控制器实例。

如果您计划使用多个视图实例,则不应在控制器中保留对这些视图的引用。

您可能想查看 Deft 的 ExtJs MVC 扩展,每个视图实例有一个控制器实例(加上依赖注入):

http://deftjs.org/

无论如何,controller.getView() 返回对视图类的引用,而不是对象实例。与 getModel() 相同。getStore() 确实返回一个商店实例。

在您的控制器中,您可以执行以下操作:

this.viewInstance = this.getDocumentsView().create();

我还建议以单数命名您的模型。它不是文件。它是一个文档。

于 2012-06-07T01:12:11.447 回答
2

这应该有效:

Ext.define('DigitalPaper.controller.Documents', {
 extend: 'Ext.app.Controller',

 views:  ['Documents'],
 stores: ['Documents'],
 models: ['Documents'],

 init: function() {
     console.log('[OK] Init Controller: Documents');

     // get references to view and model classes which can be used to create new instances
     console.log('View', this.getDocumentsView());
     console.log('Model', this.getDocumentsModel());

     // reference the Documents store
     console.log('Store', this.getDocumentsStore());

 } 

});

这些方法由 Ext 控制器中创建 getter 的方法创建。 http://docs.sencha.com/ext-js/4-0/source/Controller.html#Ext-app-Controller

该方法如下所示:

createGetters: function(type, refs) {
    type = Ext.String.capitalize(type);
    Ext.Array.each(refs, function(ref) {
        var fn = 'get',
            parts = ref.split('.');

        // Handle namespaced class names. E.g. feed.Add becomes getFeedAddView etc.
        Ext.Array.each(parts, function(part) {
            fn += Ext.String.capitalize(part);
        });
        fn += type;

        if (!this[fn]) {
            this[fn] = Ext.Function.pass(this['get' + type], [ref], this);
        }
        // Execute it right away
        this[fn](ref);
    },
    this);
},
于 2012-06-07T01:11:50.570 回答
0

getModel() 和 getView() 不返回控制器的模型/视图——它们在应用程序中返回这些的实例(如果不存在,它们将被实例化)。

您可以简单地使用它来获取视图/模型名称:

this.views[0]

我不确定你在哪里使用你的获取(即 this.getModel('Details') ),但这些应该正确返回模型的实例(构造函数是唯一可能在引用这些时遇到问题的地方)。

于 2012-06-06T15:37:06.433 回答