私は混乱しています、私は異なるコントローラーにルーティングするこのモジュールを持っています:
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()
...
}
クリックによってトリガーされるように呼び出しを変更した場合、すべて正常に機能しますが、ページの読み込み時にこのコードを実行する必要があります。正しいアプローチは何ですか?