2013-02-18 5 views
9

는 I는 GoogleMap으로가 SomePage.htmlAngularJS : 탭 선택을 보는 방법?

제 창의
<tabs> 
    <pane title="Datos Generales"> 
     <div ng-include src="'/resources/js/page/running/admin/templates/update-data.html'"></div> 
    </pane> 
    <pane title="Localización"> 
     <div ng-include src="'/resources/js/page/running/admin/templates/update-location.html'"></div> 
    </pane> 
    <pane title="Datos Contacto"> 
     <div ng-include src="'/resources/js/page/running/admin/templates/update-contacts.html'"></div> 
    </pane> 
    <pane title="Variantes"> 
     <div ng-include src="'/resources/js/page/running/admin/templates/update-variants.html'"></div> 
    </pane> 
</tabs> 

AngularJS와 탭 창 예 요소

angular.module('components', []). 
    directive('tabs', function() { 
     return { 
      restrict: 'E', 
      transclude: true, 
      scope: {}, 
      controller: function($scope, $element) { 
       var panes = $scope.panes = []; 

       $scope.select = function(pane) { 
        angular.forEach(panes, function(pane) { 
         pane.selected = false; 
        }); 
        pane.selected = true; 
       } 

       this.addPane = function(pane) { 
        if (panes.length == 0) $scope.select(pane); 
         panes.push(pane); 
        } 
       }, 
       template: 
        '<div class="tabbable">' + 
         '<ul class="nav nav-tabs">' + 
          '<li ng-repeat="pane in panes" ng-class="{active:pane.selected}">'+ 
           '<a href="" ng-click="select(pane)">{{pane.title}}</a>' + 
          '</li>' + 
         '</ul>' + 
         '<div class="tab-content" ng-transclude></div>' + 
        '</div>', 
       replace: true 
      }; 
     }). 
    directive('pane', function() { 
     return { 
      require: '^tabs', 
      restrict: 'E', 
      transclude: true, 
      scope: { title: '@' }, 
      link: function(scope, element, attrs, tabsCtrl) { 
       tabsCtrl.addPane(scope); 
      }, 
      template: 
       '<div class="tab-pane" ng-class="{active: selected}" ng-transclude>' + 
       '</div>', 
      replace: true 
     }; 
    }) 

을 사용하고있다. 두 번째 창이 선택되면 Google지도를 새로 고침하고 싶습니다.

컨트롤러에서 선택한 창을 얻는 방법을 모르겠습니다. 나는 $scope.panes을 시도했지만 여기 undefined

+0

어떤 컨트롤러를 알아야합니까? tabs 요소를 둘러싼 컨트롤러? ng-include'd update-location.html 내의 컨트롤러? –

+0

tabs 요소를 둘러싼 컨트롤러 – qopuir

+0

v 0.5 (및 이전 버전)부터 tab 지시어는 부모 범위에서 평가되는 '&'속성 인 'select'속성을 사용할 수 있으므로 더 이상 필요하지 않습니다. ui 부트 스트랩 코드를 수정하십시오. – rych

답변

7

입니다했습니다 당신이 당신의 문제를 해결할 수있는 세 가지 방법은 다음과 같습니다

  1. 는 컨트롤러의 메소드를 정의 탭 요소의 특성에서 그 방법을 지정을의 '&를 사용 '구문을 탭 지시문의 분리 된 범위 정의에 적용하여 지시문이 선택 될 때 지정된 메소드를 호출 할 수있게합니다.
  2. 컨트롤러의 범위에서 "selectedPane"속성을 사용하여 개체를 정의하십시오. 양방향 데이터 바인딩을 사용하려면 tabs 지시문의 격리 범위 정의에서 '='sytnax를 사용하십시오. 창을 선택할 때마다이 속성을 설정하십시오.
  3. 에는 $emit이라는 탭 지시문이 있고 $ controller를 사용하여 컨트롤러에서 수신 대기하도록합니다.

업데이트 : 옵션에 대한 자세한 내용은 요청 @qopuir 1.
컨트롤러 방법은 다음과 같은 것입니다 가정 : 탭 요소에

$scope.paneChanged = function(pane) { 
    $scope.selectedPane = pane 
    ... 
} 

, 우리는이 기능을 지정할 수 있습니다 속성 pane-changed로 :

<tabs pane-changed="paneChanged(selectedPane)"> 

그런 다음, 탭 지시어는 '을 사용할 수 있습니다'이 메서드를 호출하는 구문은 다음과 같습니다.

.directive('tabs', function() { 
    return { 
     restrict: 'E', 
     transclude: true, 
     scope: { paneChanged: '&' }, 
     controller: function($scope, $element) { 
      var panes = $scope.panes = []; 

      $scope.select = function(pane) { 
       angular.forEach(panes, function(pane) { 
        pane.selected = false; 
       }); 
       pane.selected = true; 
       $scope.paneChanged({selectedPane: pane}); 
      } 
+1

옵션 3을 시도했지만 여전히 문제가 있습니다. 청취자는 렌더링되기 전에지도를 새로 고침하므로 Google지도가 잘못 인쇄됩니다. 어떻게이 문제를 해결할 수 있습니까? Google지도에 AngularUI를 사용하고 있습니다. – qopuir

+1

Google지도를 처리하는 지시문이있는 경우 해당 지시자에 컨트롤러를 추가하고지도 렌더링 후 이벤트를 내 보내도록하십시오. (잘하면 Google지도가 콜백을 제공하거나 렌더링 할 때 알 수있는 몇 가지 이벤트를 바인딩 할 수 있습니다)) 콜백 또는 이벤트 핸들러에서 반드시 $ scope.apply()를 호출해야합니다. 방아쇠를 당길 콜백이나 이벤트가 없다면 어쨌든 $ timeout을 어딘가에서 사용할 수 있습니다. timeout 핸들러는 x 밀리 초 후에 호출 될 수도 있고, DOM에서 맵이 렌더링되었음을 나타내는 무언가를 확인할 수도 있습니다. –

+1

마지막으로 콜백이 제대로 작동하지 않아 $ timeout을 사용했습니다. 하지만 옵션 3으로 확신하지는 않습니다. 옵션 1을 선호하지만 매개 변수 지정 방법을 받아들이도록 tabs 지시문을 구성하는 방법을 모르겠습니다. 이 솔루션을 구현하는 방법을 자세히 설명해 주시겠습니까? – qopuir

관련 문제