我有一个模块App
和工厂i18n
,调用i18n.load
的最佳方式是什么
方法表单App(config?run?etc?)
angular
.module('App', [
'ngRoute',
'service.i18ndb'
])
.config(function ($routeProvider) {
//want to i18n.load() here somehow
$routeProvider
.when('/signin', {
templateUrl: '../views/sign-in.html',
controller: 'SigninCtrl'
})
.when('/mix', {
templateUrl: '../views/mix.html',
controller: 'MixCreateCtrl'
})
.otherwise({
redirectTo: '/signin'
});
});
angular.module('App')
.factory('service.i18ndb', function() {
return {
load: function() { console.log("Busy"); }
}
}
);
答案 0 :(得分:1)
如果使用.run
,您将始终遇到的问题是必须处理没有加载i18n的页面。这意味着当他们没有加载i18n时,你需要有办法处理你的视图。您可以隐藏它,或者文本将首先使用错误的值闪烁。
然而,AngularJS为您提供了一个很棒的功能,以确保在加载视图之前加载它:解析器!
以下是如何做到的。
var i18nResolver = function(service.i18ndb) {
return service.i18ndb.promise;
};
$routeProvider
.when('/signin' {
templateUrl: '../views/sign-in.html',
controller: 'SigninCtrl',
resolve: {
i18n: i18nResolver
}
});
您可以修复此代码,以使用您的HTTP请求或您正在使用的任何服务的正确承诺。
使用这种方式的一个好处是,您可以为i18n的不同页面使用不同的标签,并使用i18n服务来恢复它们,无论您身在何处。
答案 1 :(得分:0)
您正在定义您的应用模块两次。一个你创建工厂,它可以注入控制器并在那里使用。你可以尝试这样的事情:
angular.module('App', ['ngRoute','service.i18ndb'])
.factory('service.i18ndb', function() {
return {
load: function() { console.log("Busy"); }
}
})
.config(function ($routeProvider) {
//want to i18n.load() here somehow
$routeProvider
.when('/signin', {
templateUrl: '../views/sign-in.html',
controller: 'SigninCtrl'
})
.when('/mix', {
templateUrl: '../views/mix.html',
controller: 'MixCreateCtrl'
})
.otherwise({
redirectTo: '/signin'
});
})
.controller('SigninCtrl', function($scope, service.i18ndb) {
// Call your factory function here
service.i18ndb.load();
// If the function returns a value you could assign it to a scope
// variable so it can be used in your template 'sign-in.html'
$scope.your_variable = service.i18ndb.load();
});
答案 2 :(得分:0)
angular
.module('App', [
'ngRoute'
])
.config(function ($routeProvider) {
//want to i18n.load() here somehow
$routeProvider
.when('/signin', {
templateUrl: '../views/sign-in.html',
controller: 'SigninCtrl'
})
.when('/mix', {
templateUrl: '../views/mix.html',
controller: 'MixCreateCtrl'
})
.otherwise({
redirectTo: '/signin'
});
})
.run(['i18ndb', function(i18ndb) {
i18ndb.load();
}])
.factory('i18ndb', function() {
return {
load : function() {console.log('test')}
};
});
);
你需要一个尚未定义的模块(据我所知)。你要添加的工厂是在应用程序上。模块不是' service.i18ndb'。
然后你需要依赖注入i18ndb工厂到run方法来从那里调用它(假设你想调用该函数来引导你的应用程序)。