Angularjs 将通用控制器函数存储在服务中,以便将它们放在隔离的作用域中

Angularjs 将通用控制器函数存储在服务中,以便将它们放在隔离的作用域中,angularjs,angularjs-scope,angularjs-service,Angularjs,Angularjs Scope,Angularjs Service,我有一个角度的UI模式,我想使用下面的方法,我曾经把它放在包装整个应用程序的控制器(metaCtrl)上,但该模式似乎创建了自己的独立范围(已知问题) 我的解决方案是将这个函数存储在一个服务中,然后将它从服务返回到我需要它的任何地方 问题是,我没有以这种方式引用当前作用域,向函数添加另一个参数将是一个过头的问题 尝试使用$eval、$injector,甚至手动注入$scope,似乎都不起作用 factory('utils', function($location, $http, $window,

我有一个角度的UI模式,我想使用下面的方法,我曾经把它放在包装整个应用程序的控制器(metaCtrl)上,但该模式似乎创建了自己的独立范围(已知问题)

我的解决方案是将这个函数存储在一个服务中,然后将它从服务返回到我需要它的任何地方

问题是,我没有以这种方式引用当前作用域,向函数添加另一个参数将是一个过头的问题

尝试使用$eval、$injector,甚至手动注入$scope,似乎都不起作用

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)可以工作,但仍然不知道如何实现它