如何在AngularJS上从Controller调用服务上的函数

时间:2017-09-28 10:49:45

标签: javascript html angularjs angularjs-service angularjs-controller

我正在尝试从控制器调用服务上的功能,以便更新我网站上的主题,具体取决于我所在网站的哪个提供商部分。

我的服务,

MyApp.service('ThemeService', function() {

    var ThemeProvider = 1; 
    var ThemeArea = "NotSet";

    this.SetVariables = function() {
        switch (ThemeProvider) {
        case 1: 
        default:
            ThemeArea = "Themes/Default";
            break;

        case 2: 
            ThemeArea = "Themes/Provider2";
            break;
        }

        return ThemeProvider;
    };

return {
        ThemeProvider: ThemeProvider,
        getThemeArea: ThemeArea,
    };
});

我的控制器

$scope.loadData = function (input) {
ThemeService.ThemeProvider = 2;
ThemeService.SetVariables();
};

我的想法是在控制器内部,功能" SetVariables"可以在" ThemeProvider"之后调用。设置,更改" ThemeArea",但我无法解决如何调用函数" SetVariables"来自我的控制器。

当我尝试时,我收到错误

  

TypeError:对象不支持属性或方法' SetVariables'

2 个答案:

答案 0 :(得分:1)

你没有返回SetVariables,在服务定义的底部看到有一个return语句,它应该包含你想要访问的所有内容。

return {
    ThemeProvider: ThemeProvider,
    getThemeArea: ThemeArea,
    SetVariables: SetVariables
};

答案 1 :(得分:0)

首先,您的服务返回一个没有任何名为SetVariables的属性的对象,这就是您收到错误的原因。同时this.SetVariables将查找已初始化的ThemeProvider您的服务(var ThemeProvider = 1;),而不是从控制器分配的值。

您的代码应如下所示:

服务:

MyApp.service('ThemeService', function() {

    var _ThemeProvider = 1;
    var _ThemeArea = "NotSet";

    angular.extend(this, {
        SetVariables,
        setThemeProvider,
        setThemeArea,
        getThemeProvider,
        getThemeArea
    })

    function SetVariables() {
        switch (_ThemeProvider) {
            case 1:
            default:
                _ThemeArea = "Themes/Default";
                break;

            case 2:
                _ThemeArea = "Themes/Provider2";
                break;
        }

        return _ThemeProvider;
    };

    function setThemeProvider(val) {
        _ThemeProvider = val;
    };

    function getThemeProvider() {
        return _ThemeProvider;
    };

    function setThemeArea(val) {
        _ThemeArea = val;
    }

    function getThemeArea() {
        return _ThemeArea;
    }

});

控制器:

$scope.loadData = function(input) {
    ThemeService.setThemeProvider(2);
    ThemeService.SetVariables();
};