2016-08-21 13 views
1

horizo​​n.ioコレクションの値を増やす基本的なタスクを実行する方法を理解しようとしています。例えば、私は<h1>タグをupvotesボタンを表すことができますし、upvotesカウントを永続化したいと思います。 Vueのインスタンスで次にHorizo​​nコレクションの値を増やす

<h1 @click="inc">{{foo}}</h1> <!-- foo is local variable --> 
    <ul> 
     <li v-for="message in me"> 
     {{message.value}} <!-- message.value is upvote value from collection --> 
     </li> 
    </ul> 

created() { 
    me.store({ 
    datetime: new Date(), 
    value: this.foo // local data variable set to 0 initially. 
    }).subscribe(
     result => console.log(result), 

     error => console.log(error) 
    ) 
var self = this 
me.watch().subscribe(function(data){ 
     data.map(function(data){ 
     self.foo = data.value 
     }) 
    }) 
}, 

は、その後、私は値に<h1>タグをクリックするたびに更新しようとしています:

inc(){ 
    me.update({ 
    id: 1, 
    value: this.foo++ 
    }) 
} 

どのように私は値を更新しますコレクション内の値にアクセスするには、テンプレート内のコレクションをレンダリングする必要がありますか?

答えて

1

まず、新しいarrow function syntaxを使用するだけで、var self = thisの頭痛を避けることができます。 this機能の機能はまだ使用されますでも内this最も外側:

created() { 
    me.store({ 
    datetime: new Date(), 
    value: this.foo // local data variable set to 0 initially. 
    }).subscribe(
    result => console.log(result), 
    error => console.log(error) 
); 
    me.watch().subscribe((data) => { 
    data.map((data) => { 
     this.foo = data.value; 
    }) 
    }) 
}, 

あなたのインクリメント.update機能が正しく見えますが、私の代わりにこれを行うだろう:

inc(){ 
    this.foo++; 
    me.update({ 
    id: 1, 
    value: this.foo 
    }); 
} 

ポストフィックスと前修正は得ることができますトリッキーなので、それがreturn the value of this.foo and then incrementになると予想される出力が得られるかどうかはわかりません。

コレクションの値を更新するにはどうすればよいですか。コレクション内の値にアクセスするにはテンプレート内のコレクションをレンダリングする必要がありますか?

私が質問を正しく理解している場合は、.updateを正しく使用しているので、あなたはすでにどのように知っていますか?しかし、Vueでの私の経験から、値にアクセスできるようにコレクションをレンダリングする必要はありませんか? id: 1の文書が変更されるたびにthis.fooが再割り当てされています。最初に.storeオブジェクトを提供したときにidを入力しなかった場合は、そのドキュメントに1つを提供します。だからあなたの最初の.storeコードは、おそらく次のようになります。 試し{ me.insertを({ ID:1、 日時:新しいDate()、 値:0に初期設定this.foo //ローカルデータ変数 。 })。subscribe( 結果=> console.log(結果)、 エラー=> console.log(エラー) ); } catch(e){ console.log( "既に存在しています!"、e); }

また、あなたはそれだけで1つのid: 1ドキュメントへの変更をサブスクライブしたい:

me.find(1).watch()サブスクライブ((データ)=> { data.map((データ。 )=> { this.foo = data.value; }); });

あなたの質問にお答えしますか?

EDIT:忘れましたが、.watch

EDIT2を変更するには:それがない場合は、文書が存在し、エラーしない場合は挿入します.insertに(データ一つ一つの時間を上書きする).storeを変更します。この機能は、存在しない場合は挿入し、存在する場合は何も行わず、valueフィールドを上書きしたいだけなので、この機能が必要です。

+0

クリックハンドラをコレクションから取得した値にアタッチすると、異常な動作が発生します。インクリメントは機能しますが、更新された値は保持されません。 1つのブラウザでその値をクリックすると値が増えますが、別のブラウザでその値を開くと値は戻ってきますが、必ずしも0に戻る必要はありません。実際、値は予測できない方法でバウンスします。ここで何が起こっているのか分かりません。 –

+0

私は奇妙な増分問題を解決しましたが、値は維持されません。ブラウザをリフレッシュすると、値はゼロに戻ります。 –

+1

ちょっと@MahmudAdam私は '.store'を一度だけ実行すると仮定してばかげた間違いを犯しましたが、上記の私の更新を見れば、' .insert'を使用して、継続して実行してください。基本的には、ページを読み込むたびに、すでに存在するドキュメントを上書きしています。そのため、値は常にゼロに戻ります。 – dalanmiller

関連する問題