2016-06-24 5 views
0

現在作業しているサイトはDrupal 7でビルドされています。私はVueJSでビルドしようとしているので、ユーザー入力が必要なフォームが1つあります。フォームは1つのテンプレートファイル(.tpl.php)内にすべて含まれ、すべてのコンテンツはこのテンプレートファイルまたはVueJS Javascriptを使用して提供されます(CMSからのものは何もありません)。VueJSコンポーネントはフロントエンドでレンダリングされません(おそらくDrupalの問題)

Vueコンポーネントはフロントエンドでレンダリングされませんが、JSFiddleにコードをコピーするとVueJSとDrupalの間のやりとりに問題があると思います。 ...

enter image description here

を検査する際にここに私のマークアップのスクリーンショットはここ.tpl.phpファイルからコードがある...

<div id="app"> 
     <form> 
      <div> 
      <label for="year">Per Year</label> 
      <input type="radio" name="frequency" id="year" value="year" v-model="frequency" checked> 
      <label for="month">Per Month</label> 
      <input type="radio" name="frequency" id="month" value="month" v-model="frequency"> 
      </div> 
     </form> 

     <ul class="plans"> 
      <template id="plan-component"> 
      <h2 class="plan-name">{{ name }}</h2> 
        <h2 class="plan-cost">{{ price }}</h2> 

        <h2 class="plan-tagline">{{ tagline }}</h2> 
       <a href="#" v-on:click="makeActivePlan($event)" class="select-plan button">Choose this plan</a> 
      </template> 
      <li> 
      <plan-component :frequency="frequency" 
          name="Basic" 
          tagline="Basic tagline" 
          price-yearly="Free" 
          price-monthly="Free" 
      ></plan-component> 
      </li> 
      <li> 
      <plan-component :frequency="frequency" 
          name="Rec" 
           tagline="Rec tagline" 

          price-yearly="3" 
          price-monthly="4" 
      ></plan-component> 
      </li> 
      <li> 
      <plan-component :frequency="frequency" 
          name="Team" 
           tagline="Team tagline" 

          price-yearly="4" 
          price-monthly="5" 
      ></plan-component> 
      </li> 
      <li> 
      <plan-component :frequency="frequency" 
          name="Club" 
           tagline="Club tagline" 

          price-yearly="5" 
          price-monthly="6" 
      ></plan-component> 
      </li> 
     </ul> 
     </div> 

は私のJSからコードを..andファイル...

Vue.component('plan-component', { 
    template: '#plan-component', 

    props: ['frequency', 'name', 'tagline', 'priceYearly', 'priceMonthly'], 

    computed: { 
    'price': function() { 
     if (this.frequency === 'year') { 
     return this.priceYearly; 
     } else { 
     return this.priceMonthly; 
     } 
    } 
    }, 

    methods: { 
    makeActivePlan() { 
     // We dispatch an event setting this to become the active plan 
     this.$dispatch('set-active-plan', this); 
    } 
    } 

}); 

new Vue({ 
    el: '#app', 
    data: { 
    frequency: 'year', 
    activePlan: {name: 'no', price: 'You must select a plan!' } 
    }, 

    events: { 
    'set-active-plan': function(plan) { 
     this.activePlan = plan; 
    } 
    }, 
}); 

そして、ここでは、正しくコンポーネントを出力JSFiddleある - https://jsfiddle.net/2xgrpLm6/

+0

コンソールにエラーがありますか? – asemahle

+0

いいえ、間違いなしです。 – GuerillaRadio

答えて

1

同様の問題を抱える人にとって、 - https://vuejs.org/guide/installation.html)コンソールでエラーが発生しました[Vue warn]: Cannot find element: #app

問題は、Drupalが<div id="app">がDOMにロードされる前に<head>にスクリプトをロードしていたことでした。そのように#appが見つかりませんでした。閉じる<body>タグの前にスクリプトを出力した後、すべてがソートされました。詳細はこちらを参照[Vue warn]: Cannot find element

1

<template id="plan-component">...</template>コードをVueインスタンス外に移動してみてください。つまり、それは<div id="app">...</div>に含まれていない。

これは私には過去に同様の問題を解決しましたが、ここに当てはまるかどうかはわかりません。

+0

提案していただきありがとうございます、残念ながら、それは何の違いもありませんでした。 – GuerillaRadio

1

どのブラウザが使用していますか? <template>タグはIEではサポートされていません。

もう一つのアイデアは、あなたがそうのようなdiv要素を使用して、テンプレート内のすべてのものを包む意味(フラグメントコンポーネントを使用したことがないされていることを確認することです:?あなたをインスタンス化する前に、Vueのデバッグモードをオンにしている、

<template id="foobar"> 
    <div> 
    CONTENT HERE 
    </div> 
</template> 

最後にVueインスタンスの場合はVue.config.debug = trueに設定し、コンソールエラーが発生していないか確認してください。

+0

Vueデバッグモードを使用して問題を特定できました。 #appがまだ定義されていないので、ページコンテンツがレンダリングされる前にスクリプトが起動していました。助けてくれてありがとう。 – GuerillaRadio

関連する問題