2013-07-24 49 views
1

我已經寫了引導酥料餅的一個指令。 popover指令本身工作正常,但是當我將它與ngOptions一起使用時,ngOptions不起作用,並且不會綁定數據以選擇屬性。 該指令代碼是在這裏:ngOptions我的指令衝突並不起作用

app.directive("ngPopover", function() { 
    return { 
     restrict: "A", 
     scope: { popoverVisible: '=', popoverTitle: "=", popoverContent: "=", popoverTrigger: "@", popoverPlacement: "@" }, 
     link: function (scope, iElement, iAttrs) { 
      if (scope.popoverTrigger) { 
       $(angular.element(iElement)).popover({ 
        title: scope.popoverTitle, 
        content: scope.popoverContent, 
        trigger: (scope.popoverTrigger) ? scope.popoverTrigger : "manual", 
        placement: (scope.popoverPlacement) ? scope.popoverPlacement : "right" 
       }); 
      } 
      scope.$watch(function() { return scope.popoverVisible; }, function() { 
       $(angular.element(iElement)).popover('destroy'); 
       $(angular.element(iElement)).popover({ 
        title: scope.popoverTitle, 
        content: scope.popoverContent, 
        trigger: (scope.popoverTrigger) ? scope.popoverTrigger : "manual", 
        placement: (scope.popoverPlacement) ? scope.popoverPlacement : "right" 
       }); 
       if (scope.popoverVisible) 
        $(angular.element(iElement)).popover('show'); 
       else 
        $(angular.element(iElement)).popover('hide'); 
      }); 
     } 
    }; 
}); 

這裏是我的視圖代碼:

<div ng-app="app"> 
    <div ng-controller="Ctrl"> 
     <button class="pop btn btn-danger" ng-click="show()">Show</button> 
     <br /> 
     <select id="select" ng-options="act for act in activities" ng-model="activity" ng-popover 
      popover-visible="visPopover" popover-content="'Content'"> 
     </select> 
     <br /> 
     <button ng-click="hide()">Hide</button> 
    </div> 
</div> 

這是我的控制器功能:

function Ctrl($scope) { 
    $scope.visPopover = false; 
    $scope.activities = ['a1', 'a2', 'a3']; 
    $scope.activity = 'a1'; 
    $scope.hide = function() { 
     $scope.visPopover = false; 
    }; 
    $scope.show = function() { 
     $scope.visPopover = true; 
    }; 
} 

如果有任何其他的問題或不良行爲在我的代碼(特別是在書面指示)請讓我知道!

更新:

小提琴鏈接:http://jsfiddle.net/alisabzevari/sZbjt/1/

+1

那是因爲你的指令是創建一個孤立的範圍,其中'activities'is不可用。 – Stewie

+0

我認爲這是,但我改變了我的指令代碼爲一個沒有範圍的指令,並從屬性得到我的指令屬性,但它不起作用。 – alisabzevari

+0

你能用一個例子創建一個jsFiddle嗎? –

回答

1

的Stewie是正確的! AngularJS Developer guide

如果同一元件請求一個新的範圍的多個指令,創建僅 一個新的範圍。

所以我沒有在所有使用範圍。我從屬性中獲得了所有的指令屬性。唯一的竅門是我不得不看我的一個屬性popover-visible。 這裏是指令代碼:

app.directive("ngPopover", function() { 
      return { 
       restrict: "A", 
       link: function (scope, iElement, iAttrs) { 
        if (iAttrs.popoverTrigger) { 
         $(angular.element(iElement)).popover({ 
          title: iAttrs.popoverTitle, 
          content: iAttrs.popoverContent, 
          trigger: (iAttrs.popoverTrigger) ? iAttrs.popoverTrigger : "manual", 
          placement: (iAttrs.popoverPlacement) ? iAttrs.popoverPlacement : "right" 
         }); 
        } 
        scope.$watch(function() { return iAttrs.popoverVisible; }, function() { 
         $(angular.element(iElement)).popover('destroy'); 
         $(angular.element(iElement)).popover({ 
          title: iAttrs.popoverTitle, 
          content: iAttrs.popoverContent, 
          trigger: (iAttrs.popoverTrigger) ? iAttrs.popoverTrigger : "manual", 
          placement: (iAttrs.popoverPlacement) ? iAttrs.popoverPlacement : "right" 
         }); 
         if (scope.$eval(iAttrs.popoverVisible)) 
          $(angular.element(iElement)).popover('show'); 
         else 
          $(angular.element(iElement)).popover('hide'); 
        }); 
       } 
      }; 
     }); 
0

這裏是修復。訣竅是將select和ng-popover分開。

<div ng-app="App"> 
    <div ng-controller="Ctrl"> 
     <button class="pop btn btn-danger" ng-click="show()">Show</button> 
     <br /> 
     <ng-popover popover-visible="visPopover" popover-content="'Content'"></ng-popover> 
     <select id="select" ng-options="act for act in activities" ng-model="activity"></select> 
     <br /> 
     <button ng-click="hide()">Hide</button> 
    </div> 
</div> 

var app = angular.module('App', []); 
app.directive("ngPopover", function() { 
    return { 
     restrict: "E", 
     scope: { 
      popoverVisible: '=', 
      popoverTitle: "=", 
      popoverContent: "=", 
      popoverTrigger: "@", 
      popoverPlacement: "@" 
     }, 
     link: function (scope, iElement, iAttrs) { 
      scope.$watch(function() { 
       return scope.popoverVisible; 
      }, function() { 
       var s = iElement.parent().find("select"); 
       $(s).popover('destroy'); 
       $(s).popover({ 
        title: scope.popoverTitle, 
        content: scope.popoverContent, 
        trigger: (scope.popoverTrigger) ? scope.popoverTrigger : "manual", 
        placement: (scope.popoverPlacement) ? scope.popoverPlacement : "right" 
       }); 
       if (scope.popoverVisible) $(s).popover('show'); 
       else $(s).popover('hide'); 
      }); 
     } 
    }; 
}).controller("Ctrl", function ($scope) { 
    $scope.visPopover = false; 
    $scope.activities = ['a1', 'a2', 'a3']; 
    $scope.activity = 'a1'; 
    $scope.hide = function() { 
     $scope.visPopover = false; 
    }; 
    $scope.show = function() { 
     $scope.visPopover = true; 
    }; 
}); 

試試吧here

+0

我不工作,因爲我的popover指令名稱是ng-popover。我不得不提一提,我正在嘗試使用bootstrap popover。我認爲我的問題不夠明確。我用jsfiddle鏈接更新了這個問題 – alisabzevari

+0

@alisabzevari你說它沒有綁定數據,如果你遵循我的解決方案,它會綁定數據,就這些。爲什麼它不起作用?你有沒有試過我的解決方案? – zsong

+0

是的,我試過了。但是我的popover沒有用。很顯然,我希望兩個人都能工作! – alisabzevari