2016-05-10 23 views
13

VueJSコンポーネントを使用してスクリプトをクリーンアップしたいと考えています。したがって、私はLaravelにロードする各ページのコンポーネントを持っています。これまではすべてうまく動作します。しかし、私は現在のスクリプトロジックをコンポーネントに移す際に問題があります。私のためのキーがwindow.app = new Vue...一部ですVueJSコンポーネント

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); 
     }, 
    } 
(...) 
} 

これは、使用するコンポーネントをインポートする現在のスクリプトの設定です。私はGoogleマップを利用しているので、ページが読み込まれるとapp.initメソッドが検索されます。 (私はそれぞれのVueでのモジュールの作成)

<!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> 

個々のページ

は次のようになります。:

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

@section('content') 
content 
@endsection 

vueViewを定義することによってこれは私がブレードテンプレート内のロードしていますスクリプトの一部であります私のスクリプトでインポートしている正しいモジュールが使用されています。

目的は、HomeViewコンポーネントをメインのGoogleマップビューとして使用することです。そして、私のテーマの対応するリンクをクリックすると、私は異なるページのための他のコンポーネントを読み込みます。最後に、私はすべてのVueJSコードを1つのスクリプトに収めたくありません。したがって、モデル。

この現在のJSファイルのすべてのコンテンツを転送すると、app.initが機能ではないというエラーが表示されます。コンポーネントは次のようになります。

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

app.initの負荷が引き続き機能するようにコンポーネントを変更するにはどうすればよいですか?

答えて

7

GuillaumeLeclerc/vue-google-mapsは既にnpmでvue-google-mapsとして入手できますが、そのバージョンはvue 1でのみ動作することに注意してください。x

v2を使用している場合は、この素晴らしいvue2フォークxkjyeah/vue-google-mapsをご覧ください。これは、npmのvue2-google-mapsとして入手できます。

APIは簡単で、v1バージョンからは遠く離れず、リポジトリはアップストーム対応のものよりもはるかにアクティブです。

私の最初の行為である自分自身のものを転がすよりも、私のビューマップの作業は本当に痛いものでした。

1

私が正しく理解していれば、読み込んだときにwindow.app.initを呼び出すGoogle Mapsスクリプトがあります。

あなたのVueコンポーネントにはinit()メソッドがありますか(上記は表示されていません)?ある場合は、app.methods.init()にある必要があります.VueJSを覚えていれば、標準の呼び出し可能メソッドはmethodsキーの下に置かれます。

また、app.initがVueコンポーネントの一部であるかどうかは記述しません。そうでなければ、vueコンポーネントとしてwindow.appを再定義するため、app.init関数がオーバーライドされているように見えます。

最後に、initがVueの一部である場合、Vueがロードされる前にこのinit()を呼び出すgoogle maps fnコールバックはありますか?

+0

はい。私はGoogle Mapsスクリプトをインポートして、スクリプトのwindow.app.initコールを介してページロード時にinitメソッドをロードするように指示します。私はinit()メソッドを追加しましたが、これは偶然では表示されませんでしたが、既存のものであり、地図に関連するすべてのものを完全に細かくロードします。すべてのメソッドは生きており、メソッドキー内で作業しています。目標はコードをリファクタリングすることです。ロードされる「メイン」ページにマップビューが含まれているため、このページに必要なすべての要素だけを含むコンポーネントを作成します。別のページには異なるコンテンツがあり、そこにさまざまな方法を使いたいと思います。 – sesc360

+0

app.initはコンポーネントの一部ではありません。これらは現時点で説明されているように見えます。実際には、 'window.app = new Vue'という表現は、コンポーネントを適切に使う方法の面で私に頭痛を与えています。そのため、Googleマップスクリプトがロードされると、正しいinitメソッドが見つけられます。 – sesc360

+0

これを構造化したのは、GoogleマップをスタンドアロンのJSサービスとしてセットアップすることです。これは、Vue自体によって呼び出され、おそらくcreated()ライフサイクルコールバックで呼び出されます。あなたはこのように調整をより良くコントロールできます。これを行う必要はありませんが、それ以外の場合は、マップからvueへのコールバックが行われる前に、Vueコンポーネントが利用できるようにすべてのタイミングを調整する必要があります。 Vueのcreated()およびready()ライフサイクルコールバックのコンソールへのメモのロギングを提案し、Googleマップで同じことを行い、vueより前にマップが用意されているかどうかを確認します。 –

7

おそらく、それを行うパッケージを使用するか、少なくともコードを調べるべきです。

はたとえば、あなたはGithubの上VUE-グーグルマップを確認することができます。https://github.com/GuillaumeLeclerc/vue-google-maps/

それはGoogleマップに関連するコンポーネントの全体の多くを定義します。

関連する問題