Dans mon composant Vue, appelé Home.vue
, j'inclus ce plugin Google Maps , comme suit
<GmapMap
:center="{lat: 45.919849, lng: 25.0203875}"
:zoom="7"
map-type-id="terrain"
style="width: 100%; height: 600px"
>
<GmapMarker
:key="markerIdx"
v-for="(m, markerIdx) in results"
:position="getMarkerPosition(m.locationCoordinates)"
:clickable="true"
:draggable="false"
/>
</GmapMap>
L'objet results
provient d'une balise parent et m.locationCoordinates
est une String
. Le :position
de GmapMarker
nécessite un objet JSON. Je définis une fonction getMarkerPosition
pour transformer cette chaîne en JSON, comme si
export default {
methods: {
getMarkerPosition: function (coordinateString) {
let split = coordinateString.split(',')
return {
lat: parseFloat(split[0]),
lng: parseFloat(split[1])
}
}
}
}
mais je me retrouve avec une erreur de navigateur en disant
TypeError: _vm.getMarkerPosition is not a function
at eval (eval at ./node_modules/vue-loader/lib/template-compiler/index.js?
{"id":"data-v-8dc7cce2","hasScoped":false,"transformToRequire":{"video":
["src","poster"],"source":"src","img":"src","image":"xlink:href"},"buble":
{"transforms":{}}}!./node_modules/vue-loader/lib/selector.js?
type=template&index=0!./src/components/Home.vue
(0.96557ac29cc33c9d2325.hot-update.js:22), <anonymous>:180:63)
at Proxy.renderList (vue.esm.js?efeb:3705)
at Proxy.render (eval at ./node_modules/vue-loader/lib/template-
compiler/index.js?{"id":"data-v-
8dc7cce2","hasScoped":false,"transformToRequire":{"video":
["src","poster"],"source":"src","img":"src","image":"xlink:href"},"buble":
{"transforms":{}}}!./node_modules/vue-loader/lib/selector.js?
type=template&index=0!./src/components/Home.vue
(0.96557ac29cc33c9d2325.hot-update.js:22), <anonymous>:173:47)
at VueComponent.Vue._render (vue.esm.js?efeb:4544)
at VueComponent.updateComponent (vue.esm.js?efeb:2788)
at Watcher.get (vue.esm.js?efeb:3142)
at Watcher.run (vue.esm.js?efeb:3219)
at flushSchedulerQueue (vue.esm.js?efeb:2981)
at Array.eval (vue.esm.js?efeb:1837)
at flushCallbacks (vue.esm.js?efeb:1758)```
Le code entier est en Home.vue
. Je déclare seulement Vue.use(VueGoogleMaps)
dans main.js
Je souhaite partager ma solution au cas où quelqu'un rencontrerait un problème similaire.
Le principal problème était que le parent de ma GmapMap
était un autre composant appelé ais-results
(de Vue InstantSearch ) qui avait l'attribut inline-template
. Cela signifie que tout ce qui est à l'intérieur de la balise ais-results
ne pourra pas voir «à l'extérieur».
Ma solution élégante consistait à extraire la GmapMap
dans un fichier/composant séparé dans lequel je peux définir toutes les méthodes requises. Lorsque j'utilise mon nouveau composant, je lui passe simplement les données sous la forme props
.
Une autre solution serait d’éviter l’attribut inline-template
.
Questions et ressources connexes:
N'oubliez pas que je suis un débutant en réactivité et dans le domaine Vue. À votre santé