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用于对象技巧。我会记住这一点。