Angular.js调用控制器中的指令函数
Angular.js call directive function in controller
我想调用指令中定义的函数,与这个stackoverflow问题正好相反
我试过了,但不起作用。
app.directive('myDirective', function() {
return {
link: function(scope, element, attrs) {
scope.someDirectiveFn = function(arg) {
return "in directive";
};
},
}
});
function MyCtrl($scope) {
alert($scope.someDirectiveFn());
}
这可能吗?我怎么能拿到它?这是一种不好的做法吗?
编辑
我是这样想的:
.controller('MyCtrl', function($scope) {
alert($scope.func());
})
.directive('myDirective', function() {
return {
controller: function($scope, $element){
$scope.func = function() {
return "text";
};
}
}
});
您可以使用事件系统来实现这一点。
首先,在具有参数的作用域上发出一个自定义事件。其次,使用angular$on方法倾听指令中的作用域。
app.controller('MyCtrl', function($scope) {
$scope.invokeDirectiveMethod = function() {
$scope.$emit('invokeMyDirectiveMethod', 'myParameter');
};
})
.directive('myDirective', function() {
return {
link: function(scope, element, attrs) {
var someDirectiveFn = function(event, arg) {
alert(arg + " in directive");
};
scope.$on('invokeMyDirectiveMethod', someDirectiveFn);
},
}
});
这是一个正在工作的plunker。
更新
根据您的更新,事件通信不适合您的问题。
使用双向绑定将对象传递给指令并在该对象中定义someDirectiveFn如何?通过这种方式,您可以传递参数并从中返回值
app.controller('MyCtrl', function($scope) {
$scope.shareObject = {};
$scope.invokeDirectiveMethod = function() {
if (angular.isFunction($scope.shareObject.someDirectiveFn)) {
$scope.message = $scope.shareObject.someDirectiveFn('from controller');
}
};
})
.directive('myDirective', function() {
return {
scope: {
'shareObject': '='
},
link: function(scope, element, attrs) {
scope.shareObject.someDirectiveFn = function(arg) {
return arg + ' from parameter';
};
},
}
});
更新了plunker。
您没有发布html代码,所以我假设您的自定义指令在MyCtrl
中使用。这是不起作用的,因为函数是在什么时候执行的。
控制器功能总是在链接功能之前执行。
这是一篇关于差异的很酷的文章。
因此,如果你想让你的控制器能够调用指令中的函数,你可以广播事件(比如halilb的答案),或者让指令监听特定的范围值,比如:
app.directive('myDirective', function() {
return {
link: function(scope, element, attrs) {
scope.$watch("message", function() { console.log(message); });
},
}
});
function MyCtrl($scope) {
$scope.message = "Hello Directive";
}
我猜你想要一个在指令和控制器之间共享的函数,比如说?
如果是这种情况,那么创建一个服务并将该服务注入directive和ctrl中如何。这样你只需要创建一次。
app.service('sharedFucntionService', function() {
return {
someFn : function (arg) {
alert(arg + " in directive")
}
}
});
将服务注入指令
app.directive('myDirective',function( sharedFucntionService){
return {
link: function (scope, element, attrs) {
// do something with sharedFucntionService
}
}
});
将服务也注入控制器函数MyCtrl($scope,sharedFuctionService){。。。。。。}
相关文章:
- 从html创建一个指令,该指令按类名应用函数
- AngularJS指令单元测试中未定义的函数
- AngularJS指令部分应用的函数don'不起作用
- 角度指令's链接函数未被调用
- 从子指令调用指令函数不起作用
- 参数未在指令函数中传递
- 如何从 JavaScript 调用指令函数
- Angular.js调用控制器中的指令函数
- 将事件发送到范围中的角度指令函数
- 从父指令角度调用指令函数
- 在具有不同控制器的视图中使用ng-click和指令函数
- 通过参数将 mongo 文档 ID 传递给角度指令函数会抛出解析错误
- Angular指令——函数执行的正确顺序
- 又一个没有传递参数的Angular指令函数
- 如何使子链接指令函数在父控制器之前运行
- AngularJS中指令函数的执行顺序
- 在没有应用指令函数的指令内部重复
- 使用$scope.$parent.$$childHead从控制器访问指令函数.AngularJS中的functionNa
- angularjs设计.从另一个控制器调用指令函数
- 调用angularjs指令函数的范围问题