我在其他SO回答中读到,应该通过services
访问不操纵视图的代码。但是,我有一个函数,我想通过几个Angular控制器共享,它可以访问$scope
,$rootScope
和$location
:
$scope.selectBatch = function (id) {
if (!id) {
$scope.batchSelected = false;
$rootScope.job = false;
$scope.data = allData;
$location.path('/', false);
} else {
$scope.batchSelected = id;
$rootScope.job = {'BatchId': id};
var arr = [];
for (var i = 0; i < allData.length; i++) {
if (String(allData[i].BatchId) === String(id)) {
arr.push(allData[i]);
}
}
$scope.data = arr;
$rootScope.go(id, 'batch');
}
};
理想情况下,在每个控制器中我都想做类似的事情:
$scope.selectBatch = services.selectBatch($scope, $rootscope, $location);
从服务加载此功能,虽然这感觉“非角度”。
将这种功能注入多个控制器的“Angular”/ MVC方式是什么?
答案 0 :(得分:0)
从这个问题的评论看来,正确的答案是这样做:
<强> 1。创建一个返回函数的服务
angular.module('myApp.services', []).service('shared', ['$location', function ($location) {
this.selectBatch = function($rootScope, $scope){
return function(id){
// Do stuff with $location, id, $rootScope and $scope here
}
}
}]);
<强> 2。将服务和相关功能注入控制器
.controller('myCtrl', ['shared', '$scope', '$rootScope'
function (shared, $scope, $rootScope) {
$scope.selectBatch = shared.selectBatch($rootScope, $scope);
}]);
然后,您可以使用$scope.selectBatch(id)
调用此函数,它可以按预期工作。
很高兴考虑其他答案,如果有更好的&#34;实现这一目标的方法。
答案 1 :(得分:0)
Angular服务是使用依赖注入(DI)连接在一起的可替换对象。您可以使用服务在整个应用中组织和共享代码。
您可以使用服务在整个应用中整理和分享代码
请注意,将$ scope作为参数发送到服务并不是一个好主意。相反,你可以发送函数所需的参数来处理某些事情。这样,您的服务可以更加重复使用。
检查此问题:Injecting $scope into an angular service function()
理想情况下,您可以编写如下共享服务:
app.factory('sharedService', ['$location', function($location)
{
var sharedService = {};
sharedService.selectBatch = function(batchSelected, job, data, id)
{
//Do something with batchSelected, job, data, id parameters
};
return sharedService;
}]);
然后你的所有控制器都看起来像这样
app.controller('myCtrl', ['sharedService', function(sharedService)
{
$scope.batchSelected;
$scope.job;
$scope.data;
$scope.id;
$scope.selectBatch = sharedService.selectBatch($scope.batchSelected, $scope.job, $scope.data, $scope.id);
}]);
注意强>
您也不必发送$ location参数,因为您可以将其注入共享服务中。