Angularjs 将通用控制器函数存储在服务中,以便将它们放在隔离的作用域中
我有一个角度的UI模式,我想使用下面的方法,我曾经把它放在包装整个应用程序的控制器(metaCtrl)上,但该模式似乎创建了自己的独立范围(已知问题) 我的解决方案是将这个函数存储在一个服务中,然后将它从服务返回到我需要它的任何地方 问题是,我没有以这种方式引用当前作用域,向函数添加另一个参数将是一个过头的问题 尝试使用$eval、$injector,甚至手动注入$scope,似乎都不起作用Angularjs 将通用控制器函数存储在服务中,以便将它们放在隔离的作用域中,angularjs,angularjs-scope,angularjs-service,Angularjs,Angularjs Scope,Angularjs Service,我有一个角度的UI模式,我想使用下面的方法,我曾经把它放在包装整个应用程序的控制器(metaCtrl)上,但该模式似乎创建了自己的独立范围(已知问题) 我的解决方案是将这个函数存储在一个服务中,然后将它从服务返回到我需要它的任何地方 问题是,我没有以这种方式引用当前作用域,向函数添加另一个参数将是一个过头的问题 尝试使用$eval、$injector,甚至手动注入$scope,似乎都不起作用 factory('utils', function($location, $http, $window,
factory('utils', function($location, $http, $window, $rootScope, $injector, API_URL, WBSITE_HOST){
var baseUrl = API_URL;
var staticUrl = WBSITE_HOST;
var config = {withCredentials: true, headers:{'Accept-Language':"en"}};
var prevLang = undefined;
var helpers = {
scope: {},
showNotification: function(type, duration, msg, elmName){
var $scope = this.scope || $injector.get("$scope");
if(type == "success"){
var $scope = $injector.get("$scope");
$scope.layout.success.message = msg;
$scope.layout.success.visible = true;
if(duration === null)
return
$timeout(function(){
$scope.layout.success.visible = false;
$scope.layout.success.message = "";
}, duration);
}
else if(type == "error"){
if(elmName)
$scope.layout.error.focusElm = elmName;
$scope.layout.error.message = msg;
$scope.layout.error.visible = true;
if(duration === null)
return
$timeout(function(){
$scope.layout.error.visible = false;
$scope.layout.error.message = "";
}, duration);
}
else if(type == "persistent"){
$scope.layout.persistent.message = msg;
$scope.layout.persistent.visible = true;
}
},
closeNotification: function(){
var $scope = this.scope || $injector.get("$scope");
$scope.layout = $scope.layout ? $scope.layout : {};
$scope.layout.success = $scope.layout.success ? $scope.layout.success : {};
$scope.layout.error = $scope.layout.error ? $scope.layout.error : {};
$scope.layout.persistent = $scope.layout.persistent ? $scope.layout.persistent : {};
$scope.layout.success.visible = false;
$scope.layout.success.message = "";
$scope.layout.error.visible = false;
$scope.layout.error.message = "";
// $scope.layout.persistent.visible = false;
// $scope.layout.persistent.message = "";
}
}
return{
getHelper: function(param, scope){
helpers.scope = scope;
return helpers[param];
}
}
});
我也有过类似的问题。由于嵌套范围问题,我最终没有使用模式。然而,我想得越多,我就越觉得使用指令是正确的方法。然后给它一个transclude=true;这将允许它执行您使用它的所有操作,并为该指令提供Ctrl的作用域。我不知道这是否是最好的方法,但我很肯定它会奏效。 也许fn.call($scope)可以工作,但仍然不知道如何实现它