2017-06-20 12 views
0

vueの反応性に苦しんでいて、助けが必要です。vueコンポーネント内で非同期XMLソースのコンテンツが正しく更新されない

私のコンポーネントは、XMLドキュメントのコンテンツを表示する必要があります。異なるXMLドキュメントを切り替えるとき、一部のコンポーネントは古い値を保持し、新しいコンテンツを反映しません。これは、同じidを持つXML要素で発生すると思われます。しかし、私は、XML文書のidとXML要素のidからなるv-forループのunique:key属性を使用します。

これは、データプロパティを使用してコンテンツを設定した場合にのみ発生します。

<span v-html="value"></span> 
... 
data() { 
    return { 
    value: this.xmlNode.firstChild.nodeValue 
    }; 
} 

コンテンツを直接設定すると、期待どおりに動作します。

<span v-html="xmlNode.firstChild.nodeValue"></span> 

HTML

<div id="course"> 
    <button @click="toggle">Change content</button> 
    <edit-element 
    v-for="node in courseElementContent" 
    :xml-node="node" 
    :key="id + '#' + node.getAttribute('idref')"></edit-element> 
</div> 

はJavaScript:

Vue.component('edit-element', { 
    template: '<div><span v-html="value"></span></div>', 
    props: ["xmlNode"], 
    data() { 
    return { 
     value: this.xmlNode.firstChild.nodeValue 
    }; 
    } 
}); 

new Vue({ 
    el: "#course", 
    name: "CourseElement", 
    data: { 
     id: 1, 
     courseElementContent: null 
    }, 
    created() { 
    this.load(); 
    }, 

    methods: { 
    toggle() { 
     if (this.id == 1) this.id = 2; 
     else this.id = 1; 
     this.load(); 
    }, 
    load() { 
     var me = this; 
     axios.get("content/" + this.id + ".xml").then(
     response => { 
      var doc = new DOMParser().parseFromString(response.data, "text/xml")); 
      // get all <content> elements 
      me.courseElementContent = doc.querySelectorAll("content"); 
     }); 
    } 
    } 
}); 

私は何をしないのですか?正しい値を常に反映するためには、何を変更する必要がありますか? (注:リファレンスデータプロパティを使用して、値を設定するだけで簡単に値を変更したい)

啓発のおかげです。それはプリミティブ型を参照するよう

マイインタラクティブフィドル https://jsfiddle.net/tvjquwmn/

答えて

2

あなたのデータプロパティは反応しません。実際には、作成されたステップの後では更新されません。 あなたはそれが反応するようにしたい場合は、代わりに計算します:速い答えと作業例えばhttps://jsfiddle.net/56c7utvc/

+0

ありがとう:

Vue.component('edit-element', { template: ' <div> <span v-html="direct ? xmlNode.firstChild.nodeValue : value"></span> <span style="font-size: 60%; color:grey">({{ keyVal }})</span> </div>', props: ["xmlNode", "keyVal", "direct"], computed: { value() { return this.xmlNode.firstChild.nodeValue; } } }); 

は作業フィドルを参照してください。私はまだそれを完全に理解していません。そして、私は後のステップで値を変更できるようにしたい。どうやってするか? – kirschkern

+0

data()関数は、コンポーネントが作成されたときに一度だけ実行されます。次のレンダリングステップでは再実行されないため、明示的に更新される場合を除いて静的になります。一方、計算されたプロパティは反応的であり、依存関係の変更を監視します。 – Cobaltway

+0

これは意味があります。しかし、IMHOが明示的な更新を引き起こす一意のキー属性を使用するので、私はそれを取得しません。後でその値を変更できるようにしたいのですか?あなたの提案は何ですか? – kirschkern

関連する問題