es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Renderizar una plantilla en un cambio de campo de texto en Odoo 14.

Estoy tratando de renderizar una plantilla en el evento onchange de un campo de entrada.

Aquí está el método onchange.

*.js

_onClickBasketInputChange: function(){
  console.log('dentro del cambio de entrada',this.basketVerificationId);
  var self = this;
  var barcode = $('.basket_barcode_input').val();
  console.log('código de barras',barcode);

  return this._rpc({
    model: 'mobile.basket.verification',
    method: 'get_picking_details',
    args: [this.basketVerificationId,barcode],
  }).then(function(res){
    console.log('picking_id',res);
    var $body = this.$el.filter('.o_barcode_lines'); // Aquí obtengo el error 'Uncaught (in promise) TypeError: this is undefined'
    console.log('body',$body);
    if (res['status'] == true){
      console.log('éxito');
      var $lines = $(Qweb.render('basketVerificationLines', {
        picking:res['picking_id'],
        customer:res['partner_id'],
        lines:res['line_ids']
      }));
      $body.prepend($lines);
    }

    var message = res['result'];
    if (res['status'] == false){
      Dialog.alert(self, message);
    }
  });
},

Pero estoy obteniendo el siguiente error:
Uncaught (in promise) TypeError: this is undefined

Actualización:
Cuando cambio this por self, el valor de $body es:

body 
  Object { length: 0, prevObject: {…} }

Y la plantilla no se agrega al cuerpo.

Por favor, ayúdenme a resolver esto.

Tags:  ,

Answer

  1. Avatar for davy.ai

    El problema aquí está en el contexto de this en la función de devolución de llamada del método then. Cuando se ejecuta esa función, el contexto de this cambia a la propia función de devolución de llamada, y no a la instancia de la clase Odoo que contiene el método _onClickBasketInputChange.

    Para resolver este problema, puedes definir una variable self antes de la llamada _rpc y utilizarla dentro de la función de devolución de llamada en lugar de this. De esta manera, el contexto de this permanecerá igual y podrás acceder a la propiedad $el.

    Aquí está el código actualizado:

    _onClickBasketInputChange: function(){
      console.log('dentro del cambio de input', this.basketVerificationId);
      var self = this; // definir la variable self
      var barcode = $('.basket_barcode_input').val();
    
      return this._rpc({
        model: 'mobile.basket.verification',
        method: 'get_picking_details',
        args: [this.basketVerificationId, barcode],
      }).then(function(res){
        var $body = self.$el.find('.o_barcode_lines'); // utilizar self en lugar de this
        console.log('body', $body);
    
        if (res['status'] == true){
          console.log('éxito');
          var $lines = $(Qweb.render('basketVerificationLines', {
            picking: res['picking_id'],
            customer: res['partner_id'],
            lines: res['line_ids']
          }));
          $body.prepend($lines);
    
        }
        var message = res['result'];
        if (res['status'] == false){
          Dialog.alert(self, message);
        }
      });
    },
    

    Ten en cuenta que también he actualizado la asignación de la variable $body para utilizar el método find en lugar del método filter, ya que parece más apropiado para la funcionalidad deseada.

Comments are closed.