我有许多不同的控制器。这些控制器中的每一个都使用如下的一些功能:
$scope.isNotString = function (str) {
return (typeof str !== "string");
}
我不想继续将此功能添加到每个控制器。有没有办法可以将函数放在一个文件中,然后从每个控制器中引用该文件?
我有许多不同的控制器。这些控制器中的每一个都使用如下的一些功能:
$scope.isNotString = function (str) {
return (typeof str !== "string");
}
我不想继续将此功能添加到每个控制器。有没有办法可以将函数放在一个文件中,然后从每个控制器中引用该文件?
如果您有所有控制器的父控制器,那么最好添加到那里,或者您可以创建一个实用程序服务并将其注入到需要的每个控制器中。
如果将其添加到父控制器中,则所有子控制器都会自动继承父控制器的范围。
你有几个选择:
在根范围(或父范围)上定义函数
它也将出现在子作用域上(感谢原型继承),除了隔离作用域。
声明服务
如果您需要与隔离范围共享某些内容,这是一个很好的解决方案。如果您的应用被调用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>
为了让两个控制器共享数据或方法,您可以创建一个服务,将其注入到您想要的任何控制器中,因此每个控制器都可以访问该服务方法。我为您提供了一个工作示例,该示例显示了两个控制器,它们都注入了共享服务,并且每个控制器都从共享服务中调用相同的方法。
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();
}
}