【问题标题】:Access vars from factory in its run() method在其 run() 方法中从工厂访问变量
【发布时间】:2013-11-12 15:28:58
【问题描述】:

如何在工厂的 run 方法中访问变量?

(function()
{
    'use strict';

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

这可能是不可能的,我必须将var data; 移到工厂函数之外,对吧? (例如http://plnkr.co/edit/1sHvg0oy0Y6o20SKrTnb

【问题讨论】:

    标签: angularjs factory


    【解决方案1】:

    你可以将工厂注入到模块的.run函数中:

    myApp.factory('Hello', function () {
        var data;
        return {
            getData: function () {
                return data;
            },
            setData: function (val) {
                data = val;
            }
        };    
    });
    myApp.run(function (Hello) {
        Hello.setData(2);
    });
    

    这是一个小提琴:http://jsfiddle.net/xph8n/

    或者这里有一个似乎更接近您需求的解决方案。它使用更通用的提供程序,它返回一个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);
    });
    

    这个小提琴:http://jsfiddle.net/xph8n/3/

    【讨论】:

    • 好点。但是我想访问一个我不想在外面使用的方法setData()。这种方法会错吗? plnkr.co/edit/1sHvg0oy0Y6o20SKrTnb 谢谢。
    • 有趣的想法将它包装在一个闭包中。像这样阻止 Angular 的数据访问对我来说是有风险的。您可以采用的另一种方法是创建 2 个服务,一个具有有限访问权限的公共服务,然后将一个具有 set 方法的私有服务注入其中。您将使用私有运行,但在其他任何地方使用公共。不过,它不会强制隐私,它更像是一种策略方法(类似于 angular 如何使用 $$- 他们说它是私有的,不要使用它。但除了策略之外,实际上没有什么能阻止你)。
    • 我不确定我是否理解,抱歉。为什么会阻止 Angular 访问数据?
    • 你的 plunker 正在围绕数据创建一个闭包。也许这只是为了演示目的?
    • 我发现了一些例子,它们与您使用 IIFE 所做的完全一样,所以也许它毕竟不是那么可怕。但我还有另一个想法让你看看,我在上面的答案中添加了它。
    【解决方案2】:

    有可能,但你的结构不正确

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

    【讨论】:

    • Hello 将是 data 因为您返回的是 data 而不是包含它的对象。
    • 嗯,谢谢。但是,例如,我不希望控制器可以使用数据。工厂将返回一个从上面的代码中删除的公共接口。我认为我必须在 IIFE 但在工厂定义之前声明var data;
    • 是的,你可以这样做,但你没有使用 AnuglarJS DI。工厂是用来共享数据的,不能被限制。
    • 什么意思?如果我执行var data; (...).factory('Hello',function(){return data;}).run(function(){data=1;}); 之类的操作,效果会不会一样?
    • 它会起作用,但正如您为Hello 服务所展示的那样,它暴露了data,因此任何人都可以看到它。
    猜你喜欢
    • 1970-01-01
    • 2012-08-20
    • 1970-01-01
    • 2019-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多