2013-02-22 57 views
0

我試圖實施ng-showng-hide的animdated版本;我最初嘗試使用jQueryUI.toggle('slide', …),但由於$watch多次觸發,我的元素切換並立即切換(有時不止一次)。但是我在AngularJS的github問題中看到,那就是$ watch的預期行爲(髒檢查)。

所以我想,好吧,這一點EFF-你是該死的,我會明確地顯示或隱藏,而不是簡單的切換:我打破了下來,檢查$手錶的newValue的,像這樣的值:

scope.$watch(condition, function myShowHideAction(newValue,oldValue) { 
    if (newValue !== oldValue) { 
     if (newValue) { 
      elm.show("slide", { direction: direction }, "slow"); 
     } else { 
      elm.hide("slide", { direction: direction }, "slow"); 
     } 
    } 
} 

啓動它,我看到了什麼?切換!

在放入幾個控制檯日誌之後,我發現不知何故,我的條件值在$ watch循環期間發生了變化(它的迭代次數是6次而不是一次,但應該既不在這裏也不在那裏)。但是,實際範圍參數的值不會像newValue那樣發生變化(因爲它不應該)。

這是怎麼回事?

Plunker

回答

1

出現這種情況的原因是因爲你的InfoBoxes到共享相同的範圍。如果您在您的mySlide指令鏈接函數中放入console.log(scope)語句,您會看到它使用相同的作用域多次創建。因此,您可以在同一範圍內使用多個相同條件的手錶。

你的代碼是不是最簡單的跟隨我很害怕,但這個問題似乎是在我的-map.js上線87而不是做$compile(elm.contents())(scope);,你應該做的$compile(elm.contents())(scope.$new());製作隔離的範圍爲那個信息框。

+0

Hazzah!這似乎做到了 - 謝謝!順便說一下,我的地圖是基於Angular-UI的地圖指令(我幾乎沒有改變任何東西 - 我想爲'infoBox'找到/替換'infoWindow',所以代碼主要是他們的)。 – jacob 2013-02-22 18:20:04