2017-06-11 25 views
0

私はVueのバインドされた変数の値を変更する際に問題があります(これはVueの知識が不足しているのかJavaScriptの一般的なものなのか分かりません)。 Vueのインスタンスの初期化がさらにスクリプトダウンバインドされた変数が変更されないのはなぜですか?

var vm = new Vue({ 
    delimiters: ['<<', '>>'], 
    el: "#index-container", 
    data: { 
     posts: [], 
     tags: {}, 
    }, 
    methods: { 
     switchAll: function(what) { 
      console.log(what) 
      console.log(JSON.stringify(this.tags)) 
      _.forEach(this.tags, function (v, k) { 
       console.log(k) 
       this.tags[k] = false 
      }) 
      console.log(JSON.stringify(this.tags)) 
     } 
    }, 
(...) 

以下のコードを介して行われる

tagsの値は反応性を確実にするためにVue.set(vm.tags, tag, true)等constuctionが設定されています。彼らはその後にオブジェクトtagsの関連要素の値を変更しないよう、このDIV をクリック

<div class="tag on" v-for="(content, name) in tags" v-show="tags[name]" v-on:click="tags[name] = false"> 

としてくびれに使用されている(以前に初期化)。

これまでのところすべてが期待通りに機能します。

問題は方法switchAllにあります。私は似たv-on:click()要素(例えばswitchAll(false))でそれを使用する場合は、解雇を取得しますが、コンソール出力は以下の通りです:

false 
{"hello":true,"world":true} 
hello 
world 
{"hello":true,"world":true} 

私の問題は、最後の行は{"hello":false,"world":false}でなければならないことです。

私は(両方ともsupposed to be equivalentあるが)this.tags[k] = falsethis.tags.k = falseを使用しようと、私は私が持っている問題は(言葉遣いについての謝罪が、私はJSに新しいです)this.tagsのキーはに「裸」していることであると信じています私の場合、 "引用"されていません。どのような私の操作がないと、「引用された」、今回の新しいキーを追加することである(ただし、k()は引用符なしhelloworldのいずれかであるとして、その後this.tags.k = falseは、問題ないはず

私は失われています - 。私のコードで何が間違っています、そしてなぜdivの最初の(作業)の例ではインラインコードはlodashの専門家罰金?

答えて

1

されていないが、新しいthisを作成し、コールバック関数に問題があるようです。この問題を回避するいくつかの方法があります。例えば:

  • あなたはES6でOKであれば、ラムダ関数を使用する - 彼らは新しいthisを作成しません。

    _.forEach(this.tags, (v, k)=>{ console.log(k) this.tags[k] = false })

  • いくつかの方法全体の変数内のあなたのthisを保持するのに役立つことができます:

    var vm = this; _.forEach(vm.tags, (v, k)=>{ console.log(k) vm.tags[k] = false })

  • 使用vanillaJSオブジェクトループ:

    for (var k in this.tags) { vm.tags[k] = false }

+0

ありがとうございました - これがこれでした。私はいつも 'this'が再定義されてしまうのを嫌う(Pythonの背景から来ている) – WoJ

関連する問題