Angularjs 在工厂的run()方法中访问变量

Angularjs 在工厂的run()方法中访问变量,angularjs,factory,Angularjs,Factory,如何从工厂的run方法中访问vars (function() { 'use strict'; angular.module('services',[]) .factory('Hello',function() { var data; }) .run(function() { //Get access to data var here }); }()); 这可能是不可能的,我将不得不移动var数据到

如何从工厂的run方法中访问vars

(function()
{
    'use strict';

    angular.module('services',[])
    .factory('Hello',function()
    {
        var data;
    })
    .run(function()
    {
        //Get access to data var here
    });
}());

这可能是不可能的,我将不得不移动
var数据到出厂功能之外,对吗?(例如)

这是可能的,但您的结构不正确

(function()
{
    'use strict';

    angular.module('services',[])
    .factory('Hello',function()
    {
        var data;
        return data;
    })
    .run(function(Hello)
    {
        //Hello points to the service variable.
    });
}());

您可以将工厂注入模块的
。运行
函数:

myApp.factory('Hello', function () {
    var data;
    return {
        getData: function () {
            return data;
        },
        setData: function (val) {
            data = val;
        }
    };    
});
myApp.run(function (Hello) {
    Hello.setData(2);
});
这是一把小提琴:

或者这里有一个似乎更符合您需求的解决方案。它使用更通用的提供程序,返回一个
getData()
函数,同时保留一个私有的
setData()
。然后可以使用
.config
调用私有函数,并传入相关的提供程序:

myApp.provider('Hello', function () {

    this.data = 0;
    this.$get = function () {
        var data = this.data;
        return {
            getData: function () {
                return data;
            }
        }
    };  
    this.setData = function (data) {
        this.data = data;
    };
});

myApp.config(function (HelloProvider) {
    HelloProvider.setData(1);
});

此操作的小提琴:

你好
将是
数据
,因为您返回的是
数据
,而不是包含它的对象。嗯,谢谢。但是,例如,我不希望控制器可以使用数据。工厂将返回从上述代码中删除的公共接口。我想我必须声明
var数据在IIFE中但在工厂定义之前?是的,你可以这样做,但你没有使用AnuglarJS DI。工厂在那里共享数据,这是不受限制的。你是什么意思?如果我做了类似于
var数据的事情;(…).factory('Hello',function(){return data;}).run(function(){data=1;})它不会工作相同?它会工作,但正如您为
Hello
服务显示的那样,它正在公开
数据,以便任何人都能看到。这一点很好。但是,我想访问一个方法,
setData()
,我不想在外部使用它。这种方法会错吗?谢谢。把它包起来的好主意。这样阻止angular的数据访问对我来说很危险。另一种方法是创建两个服务,一个是公共的,访问权限有限,然后向其中注入一个私有的,具有set方法的服务。你会使用私人跑步,但在其他地方使用公共跑步。不过,这不会强制隐私,这更像是一种政策方法(类似于angular使用$$-他们说这是私人的,不要使用它。但除了政策之外,没有什么真正阻止你)。我不确定我是否理解,抱歉。为什么会阻止Angular访问数据?你的plunker正在围绕数据创建一个闭包。也许这只是为了演示的目的?我发现一些例子正是你在生活中所做的,所以也许这并不可怕。但我也有另一个想法让你看看,我把它添加到了上面的答案中。