2012-01-11 8 views
5

Sto cercando un modo per sovrascrivere alcune funzioni di base di jav web openerp come "on_logout".client web openerp 6.1: come sovrascrivere le funzioni javascript di base

La docs mancanza di istruzioni (come si può vedere in my post) e il helloworld module ti dice che si può fare come

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

}; 

Nel mio modulo sto facendo questo:

openerp.mytest = function(openerp){ 

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

So che js è caricato da quando un avviso fuori da questa definizione funziona.

Cosa c'è che non va qui?

risposta

4

Questo è un po 'un numero speciale dal momento che si desidera modificare il prototipo (la classe, se si vuole) di un oggetto che è già un'istanza (un'istanza WebClient è la radice del sistema, quindi è probabilmente già al momento del caricamento del codice, quindi la creazione di una nuova "classe" WebClient non modificherà l'istanza esistente).

In tal caso, non è possibile sostituire la classe con una sottoclasse, è necessario riaprire la classe (in modo simile a vermiglio), per cui non v'è un metodo include su oggetti di classe, che dovrebbe lavoro:

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

(come in Ruby, this._super è legato al metodo si sta sostituendo, se del caso, per le alterazioni di classe in-place)

Se si seleziona il file di implementazione view_list_editable.js, fornisce esempi di questo poiché ha bisogno di riaprire e alterare il codice di listview i n per aggiungere modificabilità.

+1

Ciao, grazie per aver risposto. Ho appena provato questo, ma non funziona. Continua a usare quello originale. FWIW Ho appena estratto l'ultima versione. – simahawk

+1

Oh diavolo, avevo dimenticato che si trattava di un "callback" (i metodi 'on_ *' e 'do_ *' sono legati direttamente alle istanze durante 'init' se la classe estende in qualche modo' openerp.web.CallbackEnabled '), e 'WebClient' viene istanziato prima di caricare qualsiasi modulo. La tua unica soluzione è usare javascript raw e accedere a 'openerp.webclient' (l'istanza del webclient per questa sessione, se presente) e modificarlo direttamente. Qualcosa come "openerp.webclient.on_logout.add_first (function() {console.log ('my logout')});' funziona. Sostituire on_logout probabilmente non funzionerà perché gli eventi sono legati con entusiasmo (una cattiva idea). – xmo

+0

Ho provato: openerp.mytest = function (OpenERP) { openerp.webclient.on_logout.add_first ('! Thatsme' function() { alert();} ); } ma sembra inutile :( – simahawk

Problemi correlati