Vue JS - how can I call may data in my filter function of javascript

En nuestra aplicación, añadí una validación de cada fila que no puedes tener 2 mismos valores de columnas. He terminado con eso, pero estoy teniendo un problema en borrar fila

Ejemplo

enter image description here

Hay un botón de eliminación en el lado derecho cuando lo hice clic, me da un error Cannot read property ..... hasta que ya está declarado en mis datos

Mensaje de error

enter image description here

Código de la cola

    deleteRow(i, e){
    var month                   = this.added_items[i].selected_month.id
    var chart_of_account_id     = this.added_items[i].selected_chart_of_account.id
    var count                   = 0 
    // var duplicate                = false 
    this.submitStatus                                       =   ''
    this.duplicate_month                                     =   false
    this.added_items.filter(function( obj ) {
        console.log(this.submitStatus)
        if((obj.selected_month.id == month && obj.selected_chart_of_account.id == chart_of_account_id) && obj.id != i){
             count++
             if(count >= 2)
             {
                // this.added_items[i].duplicate_month                 =   true
                // this.submitStatus                                   =   'ERROR'
                // this.duplicate_month                                =   true
             }
        }
        return obj.id !== i;

    });
   
   console.log(this.added_items)

    e.preventDefault()
},

Pregunta: ¿Cómo puedo llamar mis datos dentro de mi función de filtro? porque cuando intenté alguno de estos: este.submitStatus/esto.added_items[i].duplicate_month/this.duplicate_month me da un error

Pregunta hecha hace 3 años, 4 meses, 24 días - Por algorithmwhiz


3 Respuestas:

  • Puedes acercarte de dos maneras

    Opción 1: Funciones de flecha

    this.added_items.filter(( obj ) => {
        console.log(this.submitStatus)
    
        if(
            (
                obj.selected_month.id == month && 
                obj.selected_chart_of_account.id == chart_of_account_id
            ) && 
            obj.id != i
        ){
           count++
           if(count >= 2)
           {
               // this.added_items[i].duplicate_month                 =   true
               // this.submitStatus                                   =   'ERROR'
               // this.duplicate_month                                =   true
            }
       }
    
        return obj.id !== i;
    
    });
    

    Opción 2: Ajusta esto

    this.added_items.filter(function( obj ) {
        console.log(this.submitStatus)
    
        if(
            (
                obj.selected_month.id == month && 
                obj.selected_chart_of_account.id == chart_of_account_id
            ) && 
            obj.id != i
        ){
            count++
            
            if(count >= 2)
            {
                    // this.added_items[i].duplicate_month                 =   true
                    // this.submitStatus                                   =   'ERROR'
                    // this.duplicate_month                                =   true
            }
        }
    
        return obj.id !== i;
    
    }).bind(this);
    

    Respondida el Dec 21, 2020 a las 07:55 - por cybermage

    Votos positivos: 0 | Votos negativos: 0

  • En Vue.js, cuando se utiliza una función de filtro en un array, la función de filtro se ejecuta en un contexto diferente al de la instancia de Vue, por lo que la palabra clave this no hace referencia a la instancia de Vue. Para solucionar esto, puedes guardar una referencia al contexto antes de llamar a la función de filtro.

    Aquí te muestro cómo puedes hacerlo:

    javascript
    deleteRow(i, e){
        var month                   = this.added_items[i].selected_month.id
        var chart_of_account_id     = this.added_items[i].selected_chart_of_account.id
        var count                   = 0 
        var vm = this; // Guardar una referencia al contexto de Vue
    
        this.submitStatus =   '';
        this.duplicate_month =   false;
    
        this.added_items = this.added_items.filter(function( obj ) {
            console.log(vm.submitStatus); // Usar la referencia al contexto
            if((obj.selected_month.id == month && obj.selected_chart_of_account.id == chart_of_account_id) && obj.id != i){
                 count++;
                 if(count >= 2)
                 {
                    // vm.added_items[i].duplicate_month                 =   true
                    // vm.submitStatus                                   =   'ERROR'
                    // vm.duplicate_month                                =   true
                 }
            }
            return obj.id !== i;
        });
    
        console.log(this.added_items);
        e.preventDefault();
    },
    

    Al guardar una referencia al contexto de Vue en la variable vm, puedes acceder a las propiedades y datos de la instancia de Vue dentro de la función de filtro sin ningún error. Espero que esta solución te ayude a resolver tu problema.

    Respondida el Dec 22, 2020 a las 07:58 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • /TextStyle

    Respondida el Dec 22, 2020 a las 08:10 - por Gemini

    Votos positivos: 0 | Votos negativos: 0