Получение ссылки на автоматически созданный вид Sencha Touch 2 - PullRequest
0 голосов
/ 18 октября 2011

Я бы хотел получить ссылку на мой вид из моего контроллера Sencha Touch 2, который выглядит следующим образом (CoffeeScript):

Ext.define 'MyApp.view.Books',
    extend: 'Ext.Panel'
    id: 'books'
    config:
        html: 'Hello, Books!'
Ext.define 'MyApp.controller.Books',
    extend: 'Ext.app.Controller'
    views: [
        'Books'
    ]
    init: ->
        @control
            '#books':
                render: ->
                    console.log 'This is never called. Why?'
                show: ->
                    console.log 'This is called twice.'
                    # @getBooksView() is not a view instance, it is a class. Why?
                    console.log 'View class: ' + @getBooksView()?.$isClass
Ext.application
    name: 'MyApp'
    controllers: [
        'Books'
    ]
    launch: ->
        Ext.Viewport.setActiveItem
            xtype: 'booksview'

Появляется содержимое «Hello, Books» (например, компонентрендеринг), но обработчик управления рендерингом даже никогда не вызывается.Что я тут не так делаю?

1 Ответ

5 голосов
/ 20 октября 2011

Вы не должны использовать жестко id ни для одного из классов!Вы должны кодировать свой вид как:

Ext.define('MyApp.view.Books',{
    extend: 'Ext.Panel',
    alias : 'widget.books',
    config: {
        html: 'Hello, Books!'
    },
    initialize : function() {   
        // some init code etc..
        this.callParent();  
    }
});

Обратите внимание на свойство псевдонима.Это поможет вам получить ссылку на экземпляры вашего представления.Когда вы ссылаетесь на вид.Теперь в вашем контроллере у вас есть:

...
this.control({
    'books' : {    
        render: function() {
            console.log('Render method called!');
        },
        show: function() {
            console.log('Show method called!');
        }

    },
    .
    ...

Обратите внимание, что вы не обновляете свой вид с помощью свойства id, а через его псевдоним или xtype.Теперь, если вам нужен доступ к представлениям других контроллеров или любому другому компоненту вашего контроллера, вы также можете использовать доступную систему refs.В этом случае вы определите массив refs в определении контроллера следующим образом:

refs: [
    {ref: 'centerPane', selector: 'centerpane'}
],

Здесь свойство селектора - это значение, переданное Ext.ComponentQuery для получения компонента.Таким образом, вы можете получить экземпляр центральной панели:

this.getCenterPane();
...