Веб-клиент openerp 6.1: как переопределить базовые функции javascript

Я ищу способ переопределить некоторые основные функции openerp web js, такие как «on_logout».

В документах отсутствуют инструкции (как вы можете видеть в мой пост) и модуль helloworld говорит вам, что вы можете сделать это как

openerp.web_hello = function(openerp) {

openerp.web.SearchView = openerp.web.SearchView.extend({
    init:function() {
        this._super.apply(this,arguments);
        this.on_search.add(function(){console.log('hello');});
    }
});

// here you may tweak globals object, if any, and play with on_* or do_* callbacks on them

openerp.web.Login = openerp.web.Login.extend({
    start: function() {
        console.log('Hello there');
        this._super.apply(this,arguments);
    }
});

};

В моем модуле я делаю это:

openerp.mytest = function(openerp){

    openerp.web.WebClient = openerp.web.WebClient.extend({
        on_logout: function() {
            alert('mine');
            [...]
        },
    });
}

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

Что здесь не так?


person simahawk    schedule 11.01.2012    source источник


Ответы (1)


Это особая проблема, поскольку вы хотите изменить прототип (класс, если хотите) объекта, который уже создан (экземпляр WebClient является корнем системы, поэтому он, вероятно, уже существует к тому времени, когда ваш код загружается, поэтому создание нового «класса» WebClient не изменит существующий экземпляр).

В этом случае вы не можете заменить класс подклассом, вам нужно заново открыть класс (аналогично Ruby), для этого есть метод include на объектах класса, который должен работа:

openerp.mytest = function(openerp) {
    openerp.web.WebClient.include({
        on_logout: function() {
            alert('mine');
            this._super.apply(this, arguments);
        }
    });
}

(как и в Ruby, this._super привязан к методу, который вы заменяете, если таковой имеется, для изменений класса на месте)

Если вы проверите файл реализации view_list_editable.js, он предоставляет примеры этого, поскольку ему необходимо повторно открыть и изменить код списка, чтобы добавить возможность редактирования.

person xmo    schedule 11.01.2012
comment
Привет, спасибо за ответ. Я только что попробовал это, но не работает. Он продолжает использовать оригинальный. FWIW Я только что вытащил последнюю версию. - person simahawk; 11.01.2012
comment
О, черт, я забыл, что это был обратный вызов (методы on_* и do_* напрямую связаны с экземплярами во время init, если класс каким-то образом расширяет openerp.web.CallbackEnabled), а WebClient создается до загрузки любого модуля. Ваше единственное решение - использовать необработанный javascript и получить доступ к openerp.webclient (экземпляру веб-клиента для этого сеанса, если он есть) и изменить его напрямую. Что-то вроде openerp.webclient.on_logout.add_first(function () { console.log('my logout')}); работает. Замена on_logout, скорее всего, не сработает, потому что события связываются жадно (плохая идея). - person xmo; 11.01.2012
comment
Я пробовал: openerp.mytest = function(openerp) { openerp.webclient.on_logout.add_first( function () { alert('это я!'); } ); } но это тоже кажется бесполезным :( - person simahawk; 11.01.2012
comment
Хорошо, теперь это совершенно странно, это в основном то, что я добавил в тестовый/демонстрационный модуль hello: openerp.web_hello = function(openerp) { openerp.webclient.on_logout.add_first(function () {alert('thatsme!');});, и он правильно отображает предупреждение при выходе из системы. Вы уверены, что у вас нет ошибки javascript, которая препятствует загрузке или выполнению этого кода? - person xmo; 11.01.2012
comment
Ладно, я понял! Вот причины, по которым это не сработало: а) вы не должны использовать openerp.web.WebClient, но его псевдоним openerp.webclient (как вы сделали в последнем примере) - б) вы ДОЛЖНЫ использовать имя вашего реального модуля для объявление основной функции. Мой не был действительно mytest. Я использовал это просто, чтобы задать вопрос и попробовать. Это моя вина, так как это одна из немногих вещей, указанных в документах. - person simahawk; 11.01.2012
comment
Я нашел время, чтобы написать об этом несколько строк: planet.domsense.com/en/2012/01/ - person simahawk; 12.01.2012