2017-02-17 3 views
0

Ich bin neu in JS und Vue, so bitte Geduld mit mir :)

Ich habe eine Tabelle, die Vue-Komponenten unter Verwendung von zwei, die ein Elternteil wiedergegeben wird (das Tabelle - Bestellungen) und Kind (die Zeile - Bestellung).

Es gibt eine Schaltfläche, die für jede Zeile der Tabelle gedrückt werden kann, die einen AJAX für diese Zeile ausführt, aber ich muss auch die Tabelle (übergeordnet) aktualisieren, wenn die Aktion ausgeführt wird, damit es aktualisiert wird Daten.

Ich denke, ich muss $ emit im Kind verwenden, um die Aktion an die Eltern weiterzugeben, aber ich kann es nicht zum Funktionieren bringen. Hier ist der Code (Entschuldigung, es ist lang, ich habe alles entfernt, was nicht wichtig ist);

const order = { 
    template: ` 
     ...// table content 
     <td><button class="btn btn-default btn-sm" @click="assignAdvisor(id, 
             selectedOption)">Set Advisor</button></td> 
    `, 

    methods: { 
     // following is the method that is run when the button is pressed 

     assignAdvisor(id, selectedOption) { 
      axios.post('url').then(response => { 
       ..// show response message 
       orders.$emit('refreshAfterUpdate'); // also tried 
                // this.$parent.$emit(...) 
      })  
    }, 
}; 

const orders = { 
    components: { order, }, 

    props: { 
     orders: { 
      type: Object, 
     }, 
    }, 

    mounted() { 
     // this is basically the code that I need to re-run when button is pressed, 
     // which I have repeated below in a method 
     var refresh =() => { 
      axios.get('/admin/ajax/unassigned-orders') 
       .then(response => { 
       this.ordersData = response.data; 
       setTimeout(refresh, 5000); 
      }); 
     } 
     refresh(); 
    }, 

    methods: { 
     refreshAfterUpdate() { 
      axios.get('/admin/ajax/unassigned-orders') 
      .then(response => { 
      this.ordersData = response.data; 
      console.log(response); 
      }); 
     }, 
    } 
}; 

new Vue({ 
    render(createElement) { 
     const props = { 
      orders: { 
       type: Object, 
      }, 
     }; 
     return createElement(orders, { props }); 
    }, 
}).$mount('#unassignedOrders'); 

Ich bekomme keine Fehlermeldung oder irgendetwas - es funktioniert einfach nicht.

Dank

+0

Ich sehe keinen Code, der die Veranstaltung mit dem [ '$ auf method'] erfasst (https: // vuejs. org/v2/api/# vm-on). – PatrickSteele

+0

@PatrickSteele ah das klingt, als könnte es das Problem sein. Ich dachte, emit würde die refreshAfterUpdate-Methode im Elternteil ausführen? – Ash

+0

Nein, '$ emit' nimmt einen" eventName "und optional zusätzliche Argumente. Ihr '$ on'-Handler für den" eventName "kann die Aktualisierung aufrufen. – PatrickSteele

Antwort

1

OK so dank @Patrick Steele ich es herausgefunden haben.

Ich habe $ on - oops nicht benutzt.

Added Code in das eingehängte() Abschnitt und es funktioniert jetzt:

const order = { 
    template: ` 
     ...// table content 
     <td><button class="btn btn-default btn-sm" @click="assignAdvisor(id, 
             selectedOption)">Set Advisor</button></td> 
    `, 

    methods: { 
     // following is the method that is run when the button is pressed 

     assignAdvisor(id, selectedOption) { 
      axios.post('url').then(response => { 
       ..// show response message 
       orders.$emit('refreshAfterUpdate'); // also tried 
                // this.$parent.$emit(...) 
      })  
    }, 
}; 

const orders = { 
    components: { order, }, 

    props: { 
     orders: { 
      type: Object, 
     }, 
    }, 

    mounted() { 
     // this is basically the code that I need to re-run when button is pressed, 
     // which I have repeated below in a method 
     var refresh =() => { 
      axios.get('/admin/ajax/unassigned-orders') 
       .then(response => { 
       this.ordersData = response.data; 
       setTimeout(refresh, 5000); 
      }); 
     } 
     refresh(); 

      $this.on('refreshAfterUpdate',() => { 
       axios.get('/admin/ajax/unassigned-orders') 
       .then(response => { 
       this.ordersData = response.data; 
       console.log(response); 
       }); 
      }, 
     }, 
    }, 


}; 

new Vue({ 
    render(createElement) { 
     const props = { 
      orders: { 
       type: Object, 
      }, 
     }; 
     return createElement(orders, { props }); 
    }, 
}).$mount('#unassignedOrders'); 
+0

Auch habe ich gerade bemerkt, dass ich das verwenden musste. $ Eltern. $ Emittieren statt Bestellungen. $ Emit, um es zu bekommen, um die Eltern Funktion zu erkennen ... – Ash

Verwandte Themen