2017-10-08 1 views
0

Donc, je vais d'abord me pencher sur Vue.js depuis 2.0. Et j'ai du mal à passer de filter à computed.Le filtrage calculé ne fonctionne pas

Voici où je suis (en utilisant vue-resource pour l'appel API):

var moviesURL = 'http://localhost/api/movies'; 

var app = new Vue({ 
    el: '#app', 

    data: { 
    liveFilter: '', 
    movies: '' 
    }, 

    methods: { 
    getMovies: function() { 
     this.$http.get(moviesURL).then(response => { 
     this.movies = response.body; 
     }, response => { 
     console.log(response); 
     }); 
    } 
    }, 

    computed: { 
    filteredMovies: function() { 
     var self = this 
     return this.movies.filter(function(movie) { 
     return movie.indexOf(self.liveFilter) !== -1 
     }); 
    } 
    }, 

    created: function() { 
    this.getMovies(); 
    } 
}); 

Et je continue à recevoir ces erreurs:

enter image description here

Et je ne peux pas vraiment mon doigt sur ce que je fais mal ... Une idée?

Répondre

1

Vous ne pouvez pas filtrer sur une chaîne. Dans vos données movies devrait être un tableau vide, pas une chaîne vide.

De même, assurez-vous que response.body est également un tableau.

+0

Oh, je ne savais pas que l'initialisation était importante même quand vous la réévaluez après, merci. Mais sachez qu'il bloque 'return movie.indexOf' comme si le film n'était pas un tableau ... Mais '{{movie.title [0] .value}}' fonctionne dans le HTML, donc, c'est, n'est pas il? – Axiol

+0

'indexOf' fonctionne très bien uniquement pour les tableaux de valeurs primitives, par exemple' ['filter', 'filter2'] ', je suppose que votre tableau de films est une collection d'objets, pas de valeurs primitives, peut-être que vous pouvez utiliser lodash (ou undescore) à filtrer en fonction de l'attribut de l'objet https://lodash.com/docs/4.17.4#filter – madg34

+0

Mais, vous pouvez juste écrire quelque chose comme '' 'return this.movies.filter (function (movie) { retourner le film .title == self.liveFilter }); '' 'Mais gardez à l'esprit que c'est une comparaison exacte;) Peut-être que regexp aidera ici. Btw - pourquoi le titre est un tableau? – madg34

1

Vous lancez les films en tant que chaîne vide et une chaîne n'a pas de méthode .find(). Utilisez un tableau vide à la place

+0

Oh, je ne savais pas que l'initialisation était importante même quand on la repensait après, merci. Mais sachez qu'il bloque 'return movie.indexOf' comme si le film n'était pas un tableau ... Mais '{{movie.title [0] .value}}' fonctionne dans le HTML, donc, c'est, n'est pas il? – Axiol

+0

Votre requête ajax est asynchrone, de sorte que votre composant restitue sans aucune de ces données lors de la première exécution. C'est là que l'erreur se produit. Une fois les données reçues, le composant peut être rendu et créer tout le code HTML. –