0

以下のコードでwatch.jsを使用しようとしています。このアイデアは、watch.js を一発で実行する方法が多すぎるため、(vars.in_animation の) ブール値の変更を検出し、ウォッチを解除して終了します。ただし、コードが無限ループに陥り、vars.in_animation が変更されるたびにウォッチ コールバックがトリガーされ、unwatch コードが実行されません。

問題がwatch.jsの使用方法にあるのか、コードの構造に他の問題があるのか​​ わかりません。何か案は?

base.goTo = function(targetSlide){
    if (vars.in_animation || !api.options.slideshow) 
    {            
    //arrange for a callback once in_animation is false again
    //only need to detect first change from true to false, and then unwatch
    watch(vars, "in_animation", function() 
        {
        console.log('called back, value of in_animation ' + vars.in_animation);
        unwatch(vars,"in_animation",vars.alert); //never called
        base.goTo2(vars.saved_slide);
        });  

        vars.saved_slide = targetSlide; 
        return false;
     }    
     else { base.goTo2(targetSlide); }               
     } 

編集、問題のフィドルを作成しました> http://jsfiddle.net/SZ2Ut/3/

var obj = {
name: "buddy",
alert: function(){
    alert(obj.phrase + " " + obj.name);
}

}

watch(obj, "name", function(){
alert('name has changed to: ' + obj.name);
});

//should only fire once for this one
obj.name = "johnny";
unwatch(obj, "name", obj.alert);
obj.name = "phil";
4

1 に答える 1

2

unwatch3 番目の引数として削除する必要があるウォッチャー コールバックを期待しているようです。試す

watch(vars, "in_animation", function callback() {
    console.log('called back, value of in_animation ' + vars.in_animation);
    unwatch(vars,"in_animation", callback);
    base.goTo2(vars.saved_slide);
});
于 2013-01-19T15:56:52.353 に答える