2013-05-06 37 views
1

我爲我的角度應用程序創建了一個模塊,並且我有兩個與兩者都有關的相似指令。角度相同模塊的多個指令

當滾動到達頁面底部以實現無限分頁時,會觸發一個(滾動時)。另一個(fromTop)觸發可用於隱藏/顯示頁面上的「返回頁首」鏈接的「頂部」或「底部」。這是我如何設置它們:

angular.module('scroll', []).directive('fromTop', function() { 
    return function(scope, element, attributes) { 
    var raw = element[0] 
    var scrollDistance = Math.round(window.outerHeight) 

    window.onscroll = function() { 
     console.log(window.pageYOffset, raw.scrollHeight + scrollDistance) 
     if (window.pageYOffset >= raw.scrollHeight + scrollDistance) { 
     scope.position = 'bottom' 
     scope.$apply(attributes.fromTop) 
     } else { 
     scope.position = 'top' 
     scope.$apply(attributes.fromTop) 
     } 
    } 
    } 
}).directive('whenScrolled', function() { 
    return function(scope, element, attributes) { 
    var raw = element[0] 
    var scrollDistance = Math.round(window.outerHeight) 

    window.onscroll = function() { 
     //console.log(window.pageYOffset, raw.scrollHeight - scrollDistance) 
     if (window.pageYOffset >= raw.scrollHeight - scrollDistance) { 
     scope.$apply(attributes.whenScrolled) 
     } 
    } 
    } 
}); 

不幸的是,這是行不通的。似乎「whenScrolled」指令覆蓋了「fromTop」之一,並且從頂部永遠不會被調用。但是,如果我刪除「whenScrolled」,「fromTop」被調用就好了。爲什麼是這樣?

回答

2

這與angular.js完全無關。

您的問題:每次將指令附加到DOM元素時,都會覆蓋window.onscroll函數,這會導致只有最後一個應用指令可以工作。只能有一個onscroll函數。

您需要解決此限制一些如何:

  • 使用的角度服務,添加捕獲onscroll,然後更改傳播到所有的指令。
  • 使用相同的JavaScript庫。
  • 經過一番挖掘第三個選項:Angular具有相同的bind函數。作爲選項2.