我很困惑,我有这个模块可以路由到不同的控制器:
var mainModule = angular.module('lpConnect', []).
config(['$routeProvider', function ($routeProvider) {
$routeProvider.
when('/home', {template:'views/home.html', controller:HomeCtrl}).
when('/admin', {template:'views/admin.html', controller:AdminCtrl}).
when('/connect', {template:'views/fb_connect.html', controller:MainAppCtrl}).
otherwise({redirectTo:'/connect'});
}]);
和这样的公共服务:
mainModule.factory('Common', ['$rootScope', '$http', function (scope, http) {
var methods = {
changeLanguage:function (langID) {
http.get('JSON/langs/' + langID + '/captions.json').success(function (data) {
scope.lang = data;
});
},
initChat:function () {
console.log(scope); // full object
console.log(scope.settings); // undefined
}
};
//initiate
http.get('JSON/settings/settings.json').success(function (data) {
scope.settings = data;
methods.changeLanguage(scope.settings.lang);
});
return methods;
}]);
该应用程序加载并(通过 XHR)获取设置对象,我可以看到设置反映在我的 DOM 中。(例如字幕)
现在,当我从 HomeCtrl 调用 initChat 方法时,我在尝试访问 scope.settings 属性时得到一个未定义的值……奇怪的是,当我记录范围时,我可以看到设置对象……我错过了什么?
更新:我发现我做错的是直接从控制器主体调用我的方法:
function HomeCtrl($scope, $location, Common) {
...
Common.initChat()
...
}
如果我将调用更改为由单击触发,一切正常,但我确实需要在页面加载时运行此代码,正确的方法是什么?