2012-01-11 12 views
5

Estoy buscando una forma de anular algunas funciones centrales de web de openerp como "on_logout".openerp web client 6.1: cómo sobrescribir las funciones de base de JavaScript

El docs falta de instrucciones (como se puede ver en my post) y el helloworld module te dice que puede hacerlo como

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

}; 

En mi módulo que estoy haciendo esto:

openerp.mytest = function(openerp){ 

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

Sé que js se carga porque funciona una alerta fuera de esta definición.

¿Qué pasa aquí?

Respuesta

4

Eso es un poco de una edición especial, ya que desea alterar el prototipo (la clase, si se quiere) de un objeto que ya se instancia (una instancia de cliente Web es la raíz del sistema, por lo que es probable que ya allí cuando se carga el código, por lo tanto, crear una nueva "clase" de WebClient no alterará la instancia existente).

En ese caso, no puede sustituir a la clase con una subclase, hay que volver a abrir la clase (de una manera similar a Ruby), para el que no es un método include de objetos de clase, que debe trabajo:

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

(como en Ruby, this._super está ligado con el método que va a reemplazar, en su caso, por las alteraciones de clase en el lugar)

Si comprueba el archivo de implementación view_list_editable.js, proporciona ejemplos de eso ya que necesita volver a abrir y modificar el código de la lista de lista i n fin de agregar editabilidad.

+1

Hola, gracias por responder. Lo intenté pero no funciona. Sigue usando el original. FWIW Acabo de sacar el último lanzamiento. – simahawk

+1

Oh demonios, había olvidado que esto era una "devolución de llamada" (los métodos 'on_ *' y 'do_ *' están ligados directamente a instancias durante 'init' si la clase extiende' openerp.web.CallbackEnabled' de alguna manera), y 'WebClient' se instancia antes de que se cargue cualquier módulo. Su única solución es usar javascript sin formato y acceder a 'openerp.webclient' (la instancia del cliente web para esta sesión, si corresponde) y modificarla directamente. Algo así como 'openerp.webclient.on_logout.add_first (function() {console.log ('my logout')});' funciona. Reemplazar on_logout probablemente no funcionará porque los eventos están vinculados ansiosamente (una mala idea). – xmo

+0

Traté: openerp.mytest = function (OpenERP) { openerp.webclient.on_logout.add_first ('! Thatsme' function() { alerta();} ); } pero también parece inútil :( – simahawk

Cuestiones relacionadas