ウォッチャがオブジェクト内の変更を感知した際に実行する処理を記載する場所がhandler
です。
例えば以下の①の場合のコードはhandler
が無くても動きますが、②のコードは動きません。
そのため③のコードのようにdeep: true
とhandler
を用いて値の変更を監視します。
①https://jsfiddle.net/svudfLoc/
②https://jsfiddle.net/5gxa10cy/
③https://jsfiddle.net/w0kv2b6x/
追記:
ご提示のToDoリスト例に関しても、ウォッチャが監視しているtodos
はオブジェクトを値に持つ配列なので、handler
を消してしまうと正しく機能せずtodoStorage.save
が発火していないのが分かると思います。
試しにtodoStorageのsaveメソッド
にalert('fired')
を追記し、どのタイミングで呼ばれているのか確認すると分かりやすいです。
例えば、リストの左にあるチェックボックス(.toggle
)にチェックを入れると該当のtodos[index].completed
をtrue
に変更するので、このタイミングでウォッチャが反応しますが、handler
を消してしまうと変更を感知できずtodoStorage.save
は発火しません。
またテキストボックス(.edit
)からtodos[index].title
を編集する時も同じです。
変更後にリロードしてみると、ローカルストレージに保存できていないのが分かると思います。
恐らく__Nero1129さん__が「handlerを消しても動作する」と仰っているのは、addTodo
を実行した時の事だと思いますが、この場合は配列にオブジェクトをpushしているだけなのでhandler
が無くてもウォッチャは変更を感知できます。
そのためtodoStorage.save
が発火しローカルストレージに保存できています。
まとめ:
handler
を消してしまうと、addTodo
での変更はローカルストレージに保存されるが、.edit
や.toggle
でのプロパティの変更はウォッチャが感知できずにローカルストレージに保存されない。
そのため、一見すると問題無く動いているように見えるが、実際は期待された動作が正しく行われていない。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/10/22 13:14
2019/10/22 14:05
2019/10/22 14:42
2019/10/22 14:59 編集
2019/10/22 19:20 編集
2019/10/22 14:57 編集
2019/10/22 19:15 編集
2019/10/22 23:08