1

所以我有這個過濾器指令:獲得價值爲控制器

app.directive('filter', function(){ 
    return { 
    restrict: 'E', 
    transclude: true, 
    scope: { 
     callFunc: '&' 
    }, 
    template: 
      ' <div>' + 
      '  <div ng-transclude></div>' + 
      ' </div>', 
    controller: function($scope, $element, $attrs){ 
     this.getData = function() { 
      $scope.callFunc() 
     } 
    } 
    } 
}); 

app.directive('positions', function(){ 
    return { 
    require: '^filter', 
    scope: { 
     selectedPos: '=' 
    }, 
    template: 
      ' Positions: {{selectedPos}}' + 
      ' <ul>' + 
      ' <li ng-repeat="pos in positions">' + 
      '   <a href="#" ng-click="setPosition(pos); posRegData()">{{pos.name}}</a></a>' + 
      '  </li>' + 
      ' </ul>', 
    controller: function($scope, $element, $attrs){ 
      $scope.positions = [ 
      {name: '1'}, 
      {name: '2'}, 
      {name: '3'}, 
      {name: '4'}, 
      {name: '5'} 
      ]; 
      $scope.selectedPos = $scope.positions[0].name; 
      $scope.setPosition = function(pos){ 
      $scope.selectedPos = pos.name; 
      }; 

    }, 
    link: function(scope, element, attrs, filterCtrl) { 
     scope.posRegData = function() { 
      filterCtrl.getData(); 
     } 
    } 
    } 
}) 

而且控制器:

app.controller('keyCtrl', ['$scope', function($scope) { 
    var key = this; 
    key.callFunc = function() { 
    key.value = key.selectedPos; 
    console.log(key.selectedPos) 
    } 
}]); 

主要的問題是,爲什麼在控制器中得到key.selectedPos是正確的值只在第二次點擊?

這是一個plunker複製我的問題。

+0

您可以使用隔離範圍,並通過selectedPos作爲參數? – ABOS

+0

恐怕不行,因爲selectedPos實際上是一個下拉菜單裏的選擇項目 –

+0

爲什麼?你可以使用雙向綁定,雖然 – ABOS

回答

2

當你打電話給你callFunc()您可以發送PARAM。

更新您的CTRL FUNC:key.callFunc = function(filterParams),也不要忘了更新您傳遞方法call-func="key.callFunc(filterParams)

filter directive改變你的getData方法:

this.getData = function(val) { 
    $scope.callFunc({filterParams: val}) 
} 

positions directive傳遞值,你需要:

scope.posRegData = function() { 
    filterCtrl.getData({position: scope.selectedPos}); 
} 

現在在您的keyCtrl中,您可以獲得值:

key.callFunc = function(filterParams) { 
    key.value = filterParams.position; 
    console.log(filterPrams.position) 
} 

這裏是一個工作plunker

0

您可以使用在$ rootScope

$廣播在你的控制器做:

$rootScope.$broadcast('myEvent', $scope.selectedPos); 
在你的目標控制器

你再有一個聽衆:

$scope.$on('myEvent', function(event, myData){...}) 

angularJS documentation $on

plunker

+0

我試圖避免使用$廣播和其他類似的方法 –

0

至於建議,我認爲一個孤立的範圍工作:

app.directive('positions', function(){ 
    return { 
    require: '^filter', 
    scope : { 
     selectedPos: '=' 
    }, 
    template: 
     '<button dropdown>' + 
     ' {{selectedPos}}' + 
     ' <ul class="dropdown-menu">' + 
     ' <li ng-repeat="pos in positions">' + 
     '  <a href="#" ng-click="setPosition(pos)">{{pos.name}}</a></a>' + 
     ' </li>' + 
     ' </ul>' + 
     '</button>', 
    controller: function($scope, $element, $attrs){ 
      $scope.setPosition = function(pos){ 
      $scope.selectedPos = pos.name; 
      }; 
      $scope.positions = [ 
      {name: '1'}, 
      {name: '2'}, 
      {name: '3'} 
      ]; 
      $scope.selectedPos = $scope.positions[0].name; 
    } 
    } 
}); 

參見:http://plnkr.co/edit/boKjmMmsCCZem0lETT3B?p=preview

+0

奇怪,似乎工作在鉻但IE瀏覽器。 – Claies

+0

奇怪。我不知道這是一個摔車問題還是一個角度問題 –

+0

看看我的摔跤手 –