Javascript-форум (https://javascript.ru/forum/)
-   ExtJS (https://javascript.ru/forum/extjs/)
-   -   Привязать контекст (https://javascript.ru/forum/extjs/64903-privyazat-kontekst.html)

Moloch 12.09.2016 22:40

Привязать контекст
 
Здравствуйте, объясните пожалуйста почему так. есть вьюха и есть контроллер. во вьюхе есть кнопка button. В контроллере есть обработчик этой кнопки. во вьюхе я пишу так:

xtype: button,
listeners: {
click: function() {
var me = this;
me.controller.changeFrame().bind(me)
}
}


дебажу этот клик, но this не привязывается и вместо кнопки так и остается контроллером.

Infarch 13.09.2016 10:18

Для начала, bind должен врозвращать результат привязки, он не меняет саму исходную функцию. И потом, может поясните чего вы хотите добиться, какова задача в целом? Может вам и bind не нужен вовсе.

Moloch 13.09.2016 11:36

я хочу иметь доступ к нажатой кнопке (чтобы посмотреть ее атрибуты) в методе changeFrame, который описан в контроллере. Можно конечно this кнопки как аргумент передать, но почему bind не работает? Исходную функцию я не хочу менять, мне нужно чтобы this был не контроллер а кнопка

Infarch 13.09.2016 13:26

bind не работает потому, что вы никак не используете его результат. Он порождает новую функцию, а не меняет ту на которой вызван. http://docs.sencha.com/extjs/5.1.1/F...ml#method-bind

Насчет доступа к атрибутам кнопки: она передается в хенлдер как первый аргумент. Берите и читайте что нужно. Вот тут гляньте, например: https://fiddle.sencha.com/#fiddle/1gkc

Кнопка Sync имеет хендлер в контроллере, а этот хендлер берет кнопку и читает ее айди.

Infarch 13.09.2016 13:32

Кстати, вы в своем коде делаете байнд не на функцию changeFrame, а на ее результат.

changeFrame().bind
changeFrame.bind

Moloch 13.09.2016 14:29

Спасибо, действительно bind здесь не нужен.

nohuhu 13.09.2016 21:39

Moloch,

У вас слишком сложный код для такой простой задачи. ViewController специально предназначен именно для того, чтобы слушать события своих view, вам не нужно специально вызывать методы контроллера.

Ext.define('MyApp.Panel', {
    extend: 'Ext.panel.Panel',

    requires: [
        'MyApp.PanelController'
    ],

    controller: 'panel',

    items: [{
        xtype: 'button',
        text: 'foo',
        listeners: {
            click: 'onFooClick'
        }
    }]
});

Ext.define('MyApp.PanelController', {
    extend: 'Ext.app.ViewController',
    alias: 'controller.panel',

    onFooClick: function(btn) {
        // btn === foo button
    }
});


Часовой пояс GMT +3, время: 13:57.