Angularjs 在工厂的run()方法中访问变量
如何从工厂的run方法中访问varsAngularjs 在工厂的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数据到
(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正在围绕数据创建一个闭包。也许这只是为了演示的目的?我发现一些例子正是你在生活中所做的,所以也许这并不可怕。但我也有另一个想法让你看看,我把它添加到了上面的答案中。