Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript AngularJS中的指令间通信_Javascript_Angularjs_Angularjs Directive_Angularjs Scope - Fatal编程技术网

Javascript AngularJS中的指令间通信

Javascript AngularJS中的指令间通信,javascript,angularjs,angularjs-directive,angularjs-scope,Javascript,Angularjs,Angularjs Directive,Angularjs Scope,所以我有这个过滤器指令: $scope.selectedPos.value = $scope.positions[0].name; $scope.setPosition = function(pos){ $scope.selectedPos.value = pos.name; }; app.directive('filter',function(){ 返回{ 限制:'E', 是的, 范围:{ callFunc:“&” }, 模板: ' ' + ' ' + ' ',

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

$scope.selectedPos.value = $scope.positions[0].name;
$scope.setPosition = function(pos){
    $scope.selectedPos.value = pos.name;
};
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)
  }
}]);
key.selectedPos = { value: {}};

key.callFunc = function() {
    key.value = key.selectedPos.value;  
    console.log(key.selectedPos.value)
} 
主要问题是为什么控制器中的
键。selectedPos
仅在第二次单击时才获得正确的值

这是一个复制我的问题


一种方法是在调用
callFunc()

然后,我在ctrl:
key.callFunc=function(filterParams)
中更新func,但我也在更新传递的方法
call func=“key.callFunc(filterParams)

然后在
filter指令中
I将getData方法更改为:

this.getData = function(val) {
  $scope.callFunc({filterParams: val})
}
positions指令中
我传递我需要的值:

scope.posRegData = function() {
  filterCtrl.getData({position: scope.selectedPos});
}
最后,在
keyCtrl
中,我得到如下值:

key.callFunc = function(filterParams) {
  key.value = filterParams.position;
  console.log(filterPrams.position)
}
下面是一个演示此尝试的示例


本例中的问题是,这是否是一种很好的方法,请记住它在一个非常大的应用程序中。

这是因为隔离作用域是如何工作的。父作用域(您案例中的控制器)将在摘要循环运行时更新,这是在名为
callFunc
ng click
函数之后。因此,您可以将
callFunc
代码放入
$timeout
中,它将工作(但会导致另一个摘要循环)

另一种解决方案是将值放入对象中,因此当您更改对象时,控制器(具有引用)将立即看到更新:

在控制器中:

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

key.callFunc = function() {
    key.value = key.selectedPos.value;  
    console.log(key.selectedPos.value)
} 
在指令中:

$scope.selectedPos.value = $scope.positions[0].name;
$scope.setPosition = function(pos){
    $scope.selectedPos.value = pos.name;
};

查看此图。

如果您想在控制器或指令之间共享数据,使用服务几乎总是最好的选择。我要说的是$scope。$apply(),但我知道这不是一个好做法。Thx用于对象技巧。我会记住这一点。