Angularjs 将指令中的值获取到控制器中

Angularjs 将指令中的值获取到控制器中,angularjs,angularjs-directive,angularjs-scope,angularjs-controller,Angularjs,Angularjs Directive,Angularjs Scope,Angularjs Controller,所以我有这个过滤器指令: app.directive('filter',function(){ 返回{ 限制:'E', 是的, 范围:{ callFunc:“&” }, 模板: ' ' + ' ' + ' ', 控制器:函数($scope、$element、$attrs){ this.getData=函数(){ $scope.callFunc() } } } }); 应用指令('位置',函数(){ 返回{ 要求:“^filter”, 范围:{ 所选位置:'=' }, 模

所以我有这个过滤器指令:

app.directive('filter',function(){
返回{
限制:'E',
是的,
范围:{
callFunc:“&”
},
模板:
'   ' +
'       ' +
'   ',
控制器:函数($scope、$element、$attrs){
this.getData=函数(){
$scope.callFunc()
}
}
}   
});
应用指令('位置',函数(){
返回{
要求:“^filter”,
范围:{
所选位置:'='
},
模板:
'位置:{{selectedPos}}'+
“
    ”+ “
  • ”+ ' ' + “
  • ”+ “
”, 控制器:函数($scope、$element、$attrs){ $scope.positions=[ {name:'1'}, {name:'2'}, {name:'3'}, {name:'4'}, {name:'5'} ]; $scope.selectedPos=$scope.positions[0]。名称; $scope.setPosition=功能(位置){ $scope.selectedPos=pos.name; }; }, 链接:函数(作用域、元素、属性、过滤器TRL){ scope.posRegData=函数(){ filterCtrl.getData(); } } } })
以及控制器:

app.controller('keyCtrl', ['$scope', function($scope) {
  var key = this;
  key.callFunc = function() {
    key.value = key.selectedPos;
    console.log(key.selectedPos)
  }
}]);
主要问题是为什么控制器中的
键。selectedPos
仅在第二次单击时才获得正确的值


这是一个复制我的问题。

您可以在$rootScope上使用$broadcast

在控制器中,执行以下操作:

$rootScope.$broadcast('myEvent', $scope.selectedPos);
然后在目标控制器中有一个侦听器:

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


正如建议的那样,我认为一个孤立的范围是可行的:

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;
    }
  }   
});
app.directive('positions',function(){
返回{
要求:“^filter”,
范围:{
所选位置:'='
},
模板:
'' +
“{{selectedPos}}”+
“
    ”+ “
  • ”+ ' ' + “
  • ”+ “
”+ '', 控制器:函数($scope、$element、$attrs){ $scope.setPosition=功能(位置){ $scope.selectedPos=pos.name; }; $scope.positions=[ {name:'1'}, {name:'2'}, {name:'3'} ]; $scope.selectedPos=$scope.positions[0]。名称; } } });

请参阅:

调用
callFunc()
时,可以发送一个参数

在ctrl:
key.callFunc=function(filterParams)
中更新func,也不要忘记更新传递的方法
callFunc=“key.callFunc(filterParams)

过滤器指令中
将getData方法更改为:

this.getData = function(val) {
  $scope.callFunc({filterParams: val})
}
位置指令中
传递所需的值:

scope.posRegData = function() {
  filterCtrl.getData({position: scope.selectedPos});
}
现在,在
keyCtrl
中,您可以获得以下值:

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

这是一个有效的

你能使用隔离作用域并将selectedPos作为参数传递吗?恐怕不行,因为selectedPos实际上是下拉菜单中的选定项。为什么?你可以使用双向绑定,这很奇怪。我想知道这是一个plunker问题还是一个角度问题看看我的Plunks我正在试图避免使用$broadcasts和其他si相似方法