Extjs 4 MVC загружает вид из контроллера - PullRequest
18 голосов
/ 05 мая 2011

Хорошо, поэтому у меня есть контроллер с методом, в котором я хочу загрузить представление.

  1. Как загрузить вид из контроллера?
  2. Как передать некоторые параметры из контроллера в представление при загрузке?

Любая помощь очень ценится.

Ответы [ 5 ]

26 голосов
/ 05 мая 2011

Чтобы загрузить вид, вы можете использовать Ext.widget().Используйте Ext.define(), чтобы создать представление в вашем файле представления.Я бы рекомендовал использовать свойство alias для определения встроенного xtype для представления.

Когда вам нужно загрузить представление, вы создаете представление с использованием Ext.widget() и задаете xtype (псевдоним для вашего представления),Вот пример:

 // define a window
 Ext.define('MyApp.view.user.Add',
    extend: 'Ext.window.Window',
    alias : 'widget.adduser',
    .
    . // Add other properties, custom properties, methods, event handlers etc..
 });

Теперь, когда вы хотите создать экземпляр в своем пользовательском контроллере, вы делаете:

// create an instance
 var view = Ext.widget('adduser'); // refer the below note!

Примечание: обратите внимание, чтонет виджета!он автоматически добавляется к имени виджета, который вы передаете.

Теперь рассмотрим параметры передачи.Как и метод Ext.create, вы должны иметь возможность передавать любые параметры следующим образом:

 // create an instance with params
 var view = Ext.widget('adduser', {title: 'New User title'});

Относительно ссылки : ссылки помогут вам получить ссылки на представления на вашей странице.Они не помогают в создании экземпляра или загрузке представления.Если у вас есть ваше представление, вы можете использовать систему ref, чтобы получить доступ к этому экземпляру и управлять им.Вам нужно использовать ComponentQuery , чтобы получить ссылку на ваше мнение.

22 голосов
/ 05 января 2012

refs можно использовать для создания новых экземпляров, а также для доступа к существующим.Если добавить опцию autoCreate: true к вашей ссылке, вызов получателя приведет к созданию нового экземпляра с использованием определения ссылки в качестве его конфигурации, если ни один из существующих компонентов не соответствует селектору.

refs: [{
    ref: 'list'
    ,selector: 'myusersgrid#users'
    ,autoCreate: true

    // any additional options get passed as config when an instance needs to be created
    ,xtype: 'myusersgrid'
    ,itemId: 'users'
    ,store: 'Users'
    ,title: 'Users'
},{
    ref: 'otherList'
    ,selector: 'myusersgrid#administrators'
    ,autoCreate: true

    // any additional options get passed as config when an instance needs to be created
    ,xtype: 'myusersgrid'
    ,itemId: 'administrators'
    ,store: 'SpecialUsers'
    ,title: 'Special Users'
}],

Обратите внимание наиспользование # для дополнительного соответствия itemId, чтобы я мог иметь ссылки на несколько экземпляров одного и того же xtype

. Также есть опция forceCreate: true, которая заставит получателя ссылки всегда возвращать новыйэкземпляр, без него autoCreate создаст один экземпляр при первом получении, а затем продолжит возвращать тот же.

6 голосов
/ 05 мая 2011

Если я понимаю ваш вопрос, я думаю, что вы хотите использовать ссылки, посмотрите документы для Ext.app.Controller: http://dev.sencha.com/deploy/ext-4.0.0/docs/api/Ext.app.Controller.html

В основном вы создаете список ссылок, используя селекторы css:

refs: [
    {
        ref: 'list',
        selector: 'grid'
    }
],

Затем в классе вы можете получить доступ к этой ссылке, используя get, т.е.

refreshGrid: function() {
    this.getList().store.load();
}

Метод getList () создается для вас при создании ссылки на 'list'.

2 голосов
/ 15 декабря 2011

Я столкнулся с этой же проблемой.Я создал метод на своем абстрактном базовом контроллере, чтобы извлечь экземпляр представления и создать его, если он не существует.

Это будет работать должным образом даже после уничтожения представления - будет создан новый.

Ext.define('My.controller.Base', {
    extend: 'Ext.app.Controller',

    //Retrieves an instance of the top-level view
    //If it has not been created yet than one is instantiated
    //Also, overrides the .close() method on the view to 
    //null out the instance reference on the controller (very necessary)
    getViewInstance: function () {
        var self = this;

        if(!this.viewInstance) {
            if(this.views && this.views.length) {

                var view = this.getView(this.views[0]);

                this.viewInstance = view.create();

                this.viewInstance.close = function () {
                    view.prototype.close.apply(this, arguments);
                    self.viewInstance = null;
                };

            } 
        }

        return this.viewInstance;
    }
});

Теперь все мои контроллеры могут легко получить доступ к своему виду из кода контроллера без каких-либо внешних переменных.

0 голосов
/ 27 марта 2016

Использовать Ext.create («Правильное имя файла, которое нужно открыть», param1 = me);

Во вновь созданном представлении использовать this.param1 для доступа к параметрам.

EG: Ext.create ('view.HelloOverlay, param1 = "Hello", param2 = "World"); в контроллере HelloOverlay, используя это.param1 выдаст «Hello», а this.param2 выдаст «World».

Иногда передаваемые параметры будут присутствовать в представлении, поэтому используйте this.getView (). paramName

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...