Подтвердить что ты не робот

Extjs 4 MVC загружает представление с контроллера

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

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

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

4b9b3361

Ответ 1

Чтобы загрузить представление, вы можете использовать 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: refs поможет вам получить ссылки на Views на вашей странице. Они не помогают создавать экземпляр или загружать представление. Если у вас есть рендеринг, вы можете использовать систему ref, чтобы получить доступ к этому экземпляру и управлять просмотром. Вам нужно использовать ComponentQuery, чтобы получить ссылку на ваш просмотр.

Ответ 2

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

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, которая заставит ref getter всегда возвращать новый экземпляр, без него autoCreate будет создавать один экземпляр при первом его извлечении и затем продолжать возвращать тот же самый.

Ответ 3

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

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

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

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

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

Метод getList() создается для вас, когда вы создаете ref для "списка".

Ответ 4

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

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

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

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

Ответ 5

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

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

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

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