2017-06-26 15 views
0

コンポーネントcontacts-listの子コンポーネントcontactViewがあります。それ自体は子です。問題は、私は動的にボタンをクリックした後、このコンポーネントの内容vue jsが子コンポーネントにデータを渡す

HTML

<div id="wrapper"> 
    <component :is="currentView" keep-alive></component> 
</div> 

JS

var IndexPage = Vue.component('index-page', { 
    template: '<div>Welcome to index page</div>' 
}) 

var Contact = Vue.component('contactView', { 
    template: ` 
    <div class="person-info"> 
    <ul v-for="contact in contacts"> 
     <span>here</span> 
     <li v-if="contact.email"> 
     <div class="icon icon-mail"></div> 
     {{contact.email}} 
     </li> 
    </ul> 
    </div> 
    `, 
    props: ['contacts'] 
}) 

var ContactsList = Vue.component('contacts-list', { 
    template: ` 
    <div id="list"> 
    list 
    <div v-for="item in items"> 
     <div class="person"> 
      person 
      <span class="name">{{item.name}}</span> 
      <button class="trig">Show {{item.id}}</button> 
     </div> 
     <contact-view :contacts="item.contacts"> </contact-view> 
    </div> 
    </div>`, 
    computed: { 
    items: function(){ 
     return this.$parent.accounts 
    } 
    }, 
    components: { 
    'contact-view': Contact 
    } 
}) 


var app = new Vue({ 
    el: '#wrapper', 
    data: { 
    contacts: [], 
    currentView: 'index-page' 
    } 
}) 

app.currentView = 'contacts-list'; 
app.accounts = [{name: 'hello', id: 1}]; 

$(document).on("click", "button.trig", function(){ 
    alert('triggered'); 
    app.accounts[0].contacts = [{email: '[email protected]'}] 
}) 

を変更できないということです、コンポーネントは表示されません。変更されたデータ。どうやってこれを正しく行うことができますか?

答えて

1

Vue cannot detectプロパティをオブジェクトに動的に追加すると、このコードは、

app.accounts = [{name: 'hello', id: 1}]; 

では、動的ヴューにaccountsプロパティを追加しています。代わりに空の配列から始めます。このコードでも

data: { 
    contacts: [], 
    currentView: 'index-page', 
    accounts: [] 
} 

$(document).on("click", "button.trig", function(){ 
    alert('triggered'); 
    app.accounts[0].contacts = [{email: '[email protected]'}] 
}) 

以前contacts性質を持っていなかったオブジェクトにcontactsプロパティを追加しています。コードをこれに変更すると、動作します。

$(document).on("click", "button.trig", function(){ 
    alert('triggered'); 
    Vue.set(app.accounts[0],'contacts',[{email: '[email protected]'}]) 
}) 

私は、これらのすべては、Vueので行うことができますなど、あなたのデータにこれらの変更を行うためにjQueryのを使用することを選択している理由を、あなたのボタンのハンドラを設定するかわかりません。

+0

JQueryは単なる例です。あなたが提案した方法は私のためには機能しません。https://jsfiddle.net/mcfpgkyo/3/ –

+1

@ Marsel.Vまた、 'accounts'も動的に追加しています。私は答えを更新しました。 https://jsfiddle.net/mcfpgkyo/4/ – Bert

関連する問題