angularjs,第二次打电话到工厂

时间:2014-04-17 09:38:25

标签: angularjs

我有这个工厂函数来读取json文件,具体取决于语言:

medicalApp.factory('getTranslation', function($resource, $cookies, $http) {
    var defaults = $http.defaults.headers;
    defaults.get = defaults.get || {};
    defaults.get['Content-Type']='application/json';

    var values;
    var userLang = navigator.language || navigator.userLanguage;
    var lang = userLang.substring(0,2);

    console.log('cookie: ' + $cookies.lang);
    if ($cookies.lang === undefined) {
        $cookies.lang = lang;
    }

    if ($cookies.lang == 'fr') {
        values = $resource('translations/fr.json', {}, {
            query: {method:'GET',headers:{'ignored':'ignored'}}
        });
    } else {
        values = $resource('translations/de.json', {}, {
            query: {method:'GET',headers:{'ignored':'ignored'}}
        });
    }

    return values;
});

当我加载页面时,从该控制器调用那个:

medicalApp.controller('MainCtrl', function($scope, $cookies, getTranslation) {
    getTranslation.get(function(data){
        $scope.translation = data;
    });

    $scope.changeLang = function (lang) {
        console.log(lang);
        $cookies.lang = lang;
        getTranslation.get(function(data){
            $scope.translation = data;
            console.log(JSON.stringify($scope.translation));
        });
    };
});

但是当我从$ scope.changeLang调用它来改变语言时它永远不会运行。为什么呢?

我可以两次打电话给工厂吗?如果不是如何从其他json文件更新语言?

2 个答案:

答案 0 :(得分:1)

Augier是对的,你的工厂正在返回一个资源的单个实例。因此,检查语言的'If'语句只执行一次。

一种更简单的方法来实现你想要的东西(如未经测试的代码):

medicalApp.factory('getTranslation', function($resource, $cookies, $http) {

    ...

    return $resource('translations/:lang.json', {lang: '@lang'});

});

然后让您的控制器确定使用哪种语言:

medicalApp.controller('MainCtrl', function($scope, $cookies, getTranslation) {
    getTranslation.get({lang:$cookies.lang},function(data){
        $scope.translation = data;
    });

    $scope.changeLang = function (lang) {
        console.log(lang);
        $cookies.lang = lang; 
        getTranslation.get({lang:lang},function(data){
            $scope.translation = data;
            console.log(JSON.stringify($scope.translation));
        });
    };
});

答案 1 :(得分:-1)

工厂是一个单独的对象,因此与您的应用程序一样长寿,因此可以尽可能多地调用它。

你应该像这样包装工厂的所有方法:

medicalApp.factory('getTranslation', function($resource, $cookies, $http) {
    // set up any initialisations here

    var factory = {
        get: function() {
            //implement method here
        }
    }
    return factory
});