2013-01-19 42 views
0

我正試圖在下面的代碼中使用watch.js。這個想法也是以一種方式運行watch.js,因此它檢測到(vars.in_animation的)布爾變化,然後解開並退出。但是,會發生什麼情況是代碼陷入了無限循環,每次vars.in_animation都會觸發監視回調,並且監視代碼永遠不會運行。使用watch.js解開對象的問題

我不知道問題是我使用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"; 

回答

2

unwatch似乎期望應作爲其第三個參數,可以刪除觀察者回調。嘗試

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); 
}); 
+0

謝謝你,有點卡住了.. – rix