Extjs4 MVC,如何从Controller类中获取Model或View?

时间:2012-06-06 15:24:48

标签: extjs view model extjs4

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 个答案:

答案 0 :(得分:9)

找到解决方案:

在Controller中,可以使用对视图的引用:

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

所以你可以用这个获得视图:

this.getViewDocuments();

答案 1 :(得分:7)

Ext控制器非常奇怪,因为无论您有多少相关的视图实例,都有一个给定控制器的单个实例。在大多数MVC或MVP系统中,每个视图实例都有一个控制器实例。

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

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

http://deftjs.org/

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

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

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

我还建议以单数形式命名您的模型。它不是文件。这是一份文件。

答案 2 :(得分:1)

这应该有效:

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

答案 3 :(得分:0)

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

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

this.views[0]

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