2013-07-31 149 views
1

嗨我有兩個彈出式指令在同一頁上。問題是當我點擊一個他們都彈出。不同範圍的多個AngularJS指令

如何隔離每個範圍,以便只彈出被點擊的彈出窗口?

HTML

<popup class="popup"> 
    <trigger> 
    <a href="#" data-ng-click="showPopup()">Show Popup</a> 
    </trigger> 
    <pop> 
    I popped up 
    </pop> 
</popup> 

<popup class="popup"> 
    <trigger> 
    <a href="#" data-ng-click="showPopup()">Show Popup</a> 
    </trigger> 
    <pop> 
    I popped up too 
    </pop> 
</popup> 

popup.js

angular.module('sembaApp') 
    .directive('popup', function() { 
    return { 
     restrict: 'E', 
     replace: true, 
     transclude: true, 
     template: '<div data-ng-transclude></div>', 
     controller: function postLink($scope, $element, $attrs) { 
     $scope.popup = false; 
     $scope.showPopup = function() { 
      $scope.popup = !$scope.popup; 
     } 
     } 
    } 
    }) 
    .directive('trigger', function() { 
    return { 
     require: '^popup', 
     restrict: 'E', 
     replace: true, 
     transclude: true, 
     template: '<div data-ng-transclude></div>', 
    } 
    }) 
    .directive('pop', function() { 
    return { 
     require: '^popup', 
     restrict: 'E', 
     replace: true, 
     transclude: true, 
     template: '<aside data-ng-transclude data-ng-show="popup"> yay</aside>'  
    } 
    }); 

回答

1

這可能是一個更好的主意,簡化指令,因此該範圍將很容易處理。

<div ng-app="sembaApp" ng-init="popup1=false;popup2=false;"> 
    <popup class="popup" ng-model="popup1"> 
     <pop data-ng-show="popup1">I popped up</pop> 
    </popup> 
    <popup class="popup" ng-model="popup2"> 
     <pop data-ng-show="popup2">I popped up too</pop> 
    </popup> 
</div> 

angular.module('sembaApp', []) 
    .directive('popup', function() { 
    return { 
     scope:{ 
      ngModel: '=' 
     }, 
     restrict: 'E', 
     replace: true, 
     transclude: true, 
     template: '<div data-ng-transclude><a href="#" data-ng-click="showPopup()">Show Popup</a></div>', 
     link: function postLink($scope, $element, $attrs) { 
      $scope.showPopup = function() { 
       console.log($scope.ngModel); 
       $scope.ngModel = !$scope.ngModel; 
      } 
     } 
    } 
}) 

Demo on jsFiddle

+0

是的這個作品了。唯一的是我不喜歡使用ng-init,因爲它在我看來是邏輯。 – otissv

+0

好吧,您可以將該初始化邏輯移動到控制器。我只是想演示代碼並簡化一下。 – zsong

1

爲了確保每個指令,因爲不同的範圍,你可以一個scope : true添加到您的指令函數返回的對象。

你一定要檢查出documentation(「寫入指令(長版)」),它解釋了scope屬性,如何範圍隔離,綁定參數等方面的力量......

stackoverflow question提供了更好的解釋。

+0

範圍:因爲它從彈出指令隔離$ scope.popup真的不起作用。目前該文檔已關閉,因此會讀取您的鏈接。 – otissv

0

得到它通過改變$ scope.popup努力this.popup

<popup class="popup"> 
    <a href="#" data-ng-click="showPopup()">Show Popup</a> 
    <pop> 
     I popped up 
    </pop> 
    </popup> 

    controller: function postLink($scope, $element, $attrs) { 
    this.popup = false; 
    $scope.showPopup = function() { 
     this.popup = !this.popup; 
    } 
    } 
+0

你確定它正在工作嗎?這並沒有太大的意義,因爲第二個'this.popup'處於關閉狀態,並且與第一個'this.popup'完全不同。 – zsong

+0

噢我還除去觸發'<彈出類=「彈出」> Show Popup 我彈出 otissv

+0

'是第一this.popup可以去除 – otissv