2016-05-10 29 views
13

Ich möchte VueJS Komponenten verwenden, um meine Skripte zu bereinigen. Deshalb habe ich für jede Seite, die ich in Laravel einlade, eine Komponente. Bis jetzt funktioniert alles gut. Aber ich habe Probleme, meine aktuelle Skriptlogik auf eine Komponente zu übertragen.VueJS Komponenten

Dies ist der aktuelle Import Skript-Setup der verwendeten Komponenten werden:

main.js

import HomeView from './components/HomeView.vue'; 
import IncidentView from './components/IncidentView.vue'; 

window.app = new Vue({ 
    el: '.content', 

    components: { 
     HomeView, IncidentView 
    }, 

    methods: { 

     // Init GIS 
     init: function() { 

      // Initialize GIS Map 
     initGISMap(this.$els.map); 
     }, 
    } 
(...) 
} 

Schlüssel für mich ist der window.app = new Vue... Teil. Ich benutze Google Maps und suche daher beim Laden der Seite nach einer app.init-Methode. Dies ist Teil des Skripts ich in der Klinge Vorlage bin Laden:

<!DOCTYPE html> 
<html> 
<body class="hold-transition skin-blue sidebar-mini"> 
     <section class="content-header"> 
      <h1> 
       @yield('page_title') 
       <small>@yield('page_description')</small> 
      </h1> 
     </section> 

     <!-- Main content --> 
     <section class="content"> 

      @if (isset($vueView)) 
       <component is="{{ $vueView }}"> 
      @endif 
       @yield('content') 
      </component> 

     </section> 
     <!-- /.content --> 
<script src="https://maps.googleapis.com/maps/api/js?key=KEY&libraries=places&callback=app.init" async defer></script> 
</body> 
</html> 

Die einzelnen Seiten (wo ich für jeweils ein Modul in Vue erstellen) wie folgt aussehen:

@extends('app', ['vueView' => 'home-view']) 
@section('page_title', 'title') 
@section('page_description', 'title') 

@section('content') 
content 
@endsection 

Durch die Definition der vueView Variable, das richtige Modul, das ich in meinem Skript importiere, wird verwendet.

Das Ziel ist es, HomeView Komponente als die Hauptansicht von Google Maps zu verwenden. Und die anderen Komponenten für verschiedene Seiten lade ich, wenn ich auf den entsprechenden Link in meinem Thema klicke. Am Ende möchte ich nicht den gesamten VueJS Code in einem Skript haben. Daher die Modelle.

Wenn ich den gesamten Inhalt dieser aktuellen JS-Datei übertrage, bekomme ich eine Fehlermeldung, dass keine Funktion ist. Die Komponente sieht wie folgt aus:

<script> 
export default { 
    data: { 
     // SEARCH 
     addressComponents: '', 
     autocompletePlace: '', 
     autocompleteAddress: '', 
(...) 
} 

Wie kann ich eine Komponente in einer Art und Weise ändern, dass die app.init Belastung noch funktionieren würde?

Antwort

7

Jemand hat bereits erwähnt GuillaumeLeclerc/vue-google-maps, die auf Npm als vue-google-maps verfügbar ist, aber sei gewarnt, dass diese Version nur mit Vue 1 funktioniert.x

Wenn Sie v2 verwenden, schauen Sie sich diese große vue2 Gabel xkjyeah/vue-google-maps - es ist verfügbar als vue2-google-maps on npm.

Die API ist einfach und nicht weit von der Version v1 abweichen, und das Repository ist viel aktiver als sein UpsTeam Pendant.

Es machte wirklich meine vue Karte viel mehr schmerzlos arbeiten als meine eigenen Rollen, das ist, was ich anfangs tat.

Ich hoffe, dass hilft

1

Wenn ich Sie richtig verstehe, haben Sie ein Google Maps-Skript, das, wenn geladen, window.app.init aufruft, richtig?

Hat Ihre Vue-Komponente eine init() -Methode (keine ist oben abgebildet)? Wenn es einen gab, müsste es bei app.methods.init() sein, erinnern Sie sich für VueJS, Standard aufrufbare Methoden leben unter Methoden Schlüssel.

Alternativ: Sie erwähnen nicht, ob Ihr app.init Teil der Vue-Komponente ist oder nicht. Wenn dies nicht der Fall ist, wird Ihre app.init-Funktion überschrieben, weil Sie window.app als Ihre vue-Komponente neu definieren.

Schließlich, wenn Ihre init Teil von Vue ist, ruft Ihr Google Maps fn Callback dieses init() vor dem Vue geladen wird und daher keine solche Methode existiert (noch)?

+0

Ja. Ich importiere das Google Maps-Skript und fordere es auf, die init-Methode beim Laden der Seite über den window.app.init-Aufruf im Skript zu laden. Ich habe die Methode init() hinzugefügt, die nicht zufällig angezeigt wurde, aber existiert und lädt alles, was mit der Karte zu tun hat. Alle Methoden sind live und arbeiten innerhalb des Methodenschlüssels. Das Ziel ist nun, den Code zu refaktorieren, und da die "Haupt" -Seite, die geladen wird, die Kartenansicht enthält, möchte ich die Komponente erstellen, die nur all die Dinge enthält, die für diese Seite benötigt werden. Eine andere Seite wird einen anderen Inhalt haben und ich möchte dort verschiedene Methoden verwenden. – sesc360

+0

Die App.init ist nicht Teil der Komponenten. Diese sehen gerade so aus, wie sie gerade beschrieben werden. Tatsächlich macht mir der Ausdruck 'window.app = new Vue' Kopfschmerzen, wenn ich die Komponenten richtig verwende. Wenn also das Google Maps-Skript geladen wird, findet es die richtige init-Methode. – sesc360

+0

So, wie ich das strukturiert hätte, ist Google Maps als eigenständigen JS-Dienst einzurichten, der vom Vue selbst aufgerufen wird, möglicherweise in seinem erstellten() Lebenszyklus-Callback. Auf diese Weise haben Sie eine bessere Kontrolle über die Koordination. Sie müssen dies nicht tun, aber ansonsten müssen Sie das Timing von allem koordinieren, so dass die Vue-Komponente verfügbar ist, bevor der Rückruf von den Karten auf die Vue erfolgt. Vorschlagen Anmeldung eine Notiz in dem() erstellt und bereit() Lifecycle-Rückrufen des Vue zu trösten und gleicht in Google Maps zu tun, um zu sehen, ob Sie Ihre Karten vor Ihrer vue bereit sind. –

7

Vielleicht sollten Sie den Code eines Pakets, das das tut, verwenden oder zumindest studieren.

Zum Beispiel können Sie vue-google-maps auf Github überprüfen: https://github.com/GuillaumeLeclerc/vue-google-maps/

Es definiert eine ganze Reihe von Komponenten im Zusammenhang mit Google Maps.