我有这个工厂函数来读取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文件更新语言?
答案 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
});