我有许多不同的控制器。这些控制器中的每一个都使用 这样的一些功能:
$scope.isNotString = function (str) {
return (typeof str !== "string");
}
我不想继续向每个控制器添加此功能。我有办法吗? 可以将函数放在一个文件中,然后只从每个文件引用该文件 控制器?
答案 0 :(得分:1)
如果你有一个所有控制器的父控制器,那么最好添加它,或者你可以创建一个utilityService并将其注入每个必要的控制器。
如果将其添加到父控制器中,则自动所有子控制器都会继承父控制器的范围。
答案 1 :(得分:1)
您有几种选择:
在根范围(或父范围)上定义函数
除了隔离范围外,它也会出现在子范围内(感谢prototypal inheritance)。
声明服务
如果您需要与隔离范围共享内容,这是一个很好的解决方案。如果您的应用被称为myApp
:
myApp.service('stringUtil', function () {
this.isNotString = function (str) {
return (typeof str !== "string");
};
});
myApp.directive('something', function (stringUtil) {
return {
link: function (scope, element, attr) {
scope.isNotString = stringUtil.isNotString;
}
};
});
使用指令控制器
附加到同一标签的指令可以共享其控制器。这在您的情况下似乎没有用,但如果您需要标记上的共享状态,则会有所帮助。例如,我有一个指令modal
,它共享函数来打开一个模态。
myApp.directive('modal', function () {
return {
controller: function () {
this.openModal = function() {…};
this.close = function() {…};
}
};
});
myApp.directive('userSettings', function () {
return {
restrict: 'E',
require: 'modal',
link: function (scope, element, attr, modalController) {
scope.close = modalController.close;
}
};
}};
标记为:
<user-settings modal>
<a ng-click="close()">Close</a>
<h1>User Settings</h1>
</user-settings>
答案 2 :(得分:1)
为了让两个控制器共享数据或方法,您可以创建一个注入所需控制器的服务,因此每个控制器都可以访问该服务方法。我已经为您提供了一个工作示例,显示了两个控制器,两个控制器都注入了共享服务,每个控制器都从共享服务调用相同的方法。
app.service('myService',function(){
this.sharedFunction = function() {
//do some stuff
};
});
myCntrl1($scope,myService) {
$scope.doSomething = function() {
myService.sharedFunction();
}
}
myCntrl2($scope,myService) {
$scope.doSomething = function() {
myService.sharedFunction();
}
}