简体   繁体   English

控制器之间通过服务共享数据(AngularJS)

[英]Share data between controllers with a service (AngularJS)

I want to build a site, which supports several languages. 我想建立一个支持多种语言的网站。 So I wanted to use AngularJS Controllers to controll the view. 所以我想使用AngularJS控制器来控制视图。 I have written some script, but I get the following error: TypeError: Cannot read property 'getLang' of undefined 我已经编写了一些脚本,但是出现以下错误:TypeError:无法读取未定义的属性“ getLang”

Here is my AngularJS code: 这是我的AngularJS代码:

var myApp = angular.module('myApp',[]);
myApp.service('languageService' , function() {
    var language = 'en';
    return {
        getLang: function() {
            return language;
        },

        setLang: function(ind) {
              if (ind == 0) {
                  language = 'en';
              } else if (ind == 1) {
                  language = 'ru';
              }
        }
    };
})

myApp.controller('ChangeLangCtrl', ['$scope', function($scope, languageService) {
     $scope.changeLang = function(ind) {
        languageService.setLang(ind);
     }
}])

myApp.controller('NaviCtrl', ['$scope', function($scope, languageService) {
    var currentLang = languageService.getLang();
    if (currentLang == 'en') {
        $scope.menu = ['About Us', 'Service', 'Contacts'];
    } else {
        $scope.menu = ['О нас', 'Наши Услуги', 'Связь с нами']
    }
}])

So what could be my mistake? 那我的错误可能是什么? I mean, I initialize the language variable with en at the beginning. 我的意思是,我在一开始使用en初始化语言变量。 So why is the getLang() function then undefined? 那么为什么getLang()函数然后未定义?

['$scope', function($scope, languageService) 

You didm;t specify languageService 您没有指定languageService

It must be 一定是

['$scope', 'languageService', function($scope, languageService) 

That's the reason why you are getting languageService.getLang is undefined because you've not specified any value for languageService so getLang doesn't exit. 这就是为什么未定义languageService.getLang的原因,因为您没有为languageService指定任何值,所以getLang不会退出。

So your code will become: 因此,您的代码将变为:

myApp.controller('ChangeLangCtrl', [['$scope', 'languageService', 
function($scope, languageService)  {
     $scope.changeLang = function(ind) {
        languageService.setLang(ind);
     }
}])

myApp.controller('NaviCtrl', ['$scope', 'languageService', function($scope, languageService)  {
    var currentLang = languageService.getLang();
    if (currentLang == 'en') {
        $scope.menu = ['About Us', 'Service', 'Contacts'];
    } else {
        $scope.menu = ['О нас', 'Наши Услуги', 'Связь с нами']
    }
}])
You forget to inject languageService as a dependency in your controller,thats why its throwing that error.

Try this,

var myApp = angular.module('myApp',[]);
myApp.service('languageService' , function() {
    var language = 'en';
    return {
        getLang: function() {
            return language;
        },

        setLang: function(ind) {
              if (ind == 0) {
                  language = 'en';
              } else if (ind == 1) {
                  language = 'ru';
              }
        }
    };
})

myApp.controller('ChangeLangCtrl', ['$scope','languageService', function($scope, languageService) {
     $scope.changeLang = function(ind) {
        languageService.setLang(ind);
     }
}])

myApp.controller('NaviCtrl', ['$scope','languageService', function($scope, languageService) {
    var currentLang = languageService.getLang();
    if (currentLang == 'en') {
        $scope.menu = ['About Us', 'Service', 'Contacts'];
    } else {
        $scope.menu = ['О нас', 'Наши Услуги', 'Связь с нами']
    }
}])

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM