3

私は混乱しています、私は異なるコントローラーにルーティングするこのモジュールを持っています:

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()
...
}

クリックによってトリガーされるように呼び出しを変更した場合、すべて正常に機能しますが、ページの読み込み時にこのコードを実行する必要があります。正しいアプローチは何ですか?

4

2 に答える 2

3

これは単純な問題だと思います。$http呼び出しがscope.settingsを取得する前に、スコープ内でinitChatを呼び出しています。

于 2012-07-08T15:18:05.500 に答える
0

いくつかのこと。

  1. httpは非同期であり、それがあなたの主な問題です(Andyが鋭く指摘したように)
  2. ng-initは本番コードには推奨されません。コントローラーでの初期化の方が優れています
  3. scope.settings = {}または適切なデフォルトを初期化すると役立つ場合があります。xhrが完了すると、設定が使用可能になります。

お役に立てれば

-ダン

于 2012-07-11T17:59:25.747 に答える