0

AngularJs コントローラーのいくつかを遅延ロードするために ocLazyload を使い始めました。$routeProvider私はこのようなものと一緒にそれを使用しました

  $routeProvider.when("/login", {
        templateUrl: "login.html",
        resolve: {
            loadCtrl: ['$ocLazyLoad', function($ocLazyLoad) {
                return $ocLazyLoad.load('LoginCtrl.js');
            }]
        }
    }).

これはうまくいきます。

resolveコントローラーをロードする前にプロパティを使用していくつかのアイテムを解決する別のルート定義があります。

 when("/dashboard", {
        templateUrl: "dashboard.html",
        controller: "DashboardCtrl",
        resolve: {
            profileData: getProfile,
            count : getCount
        }
    }).

今、このコントローラーも遅延ロードしたいので、このように試しました

   when("/dashboard", {
        templateUrl: "dashboard.html",
        resolve: {
            profileData: getProfile,
            count : getCount,
            loadCtrl: ['$ocLazyLoad', function($ocLazyLoad) {
                return $ocLazyLoad.load(['DashboardCtrl.js']);
            }]
        }
    }).

この場合、ページは読み込まれますが、profileDataandcountはコントローラーに挿入されません。コントローラの定義は次のとおりです。

var app = angular.module('gt');
app.controller('DashboardCtrl', ['$scope', '$rootScope', 'profileData', 'count',
    function($scope, $rootScope, profileData, count) {
...
}]);

getProfileデバッグ時に、メソッド get が呼び出されていることに気付きましたが、getCount非同期で発生し、コントローラーもこれらのメソッドを待たずに遅延ロードします。注入と遅延ロードを同時に行うにはどうすればよいですか? これを何らかの方法で解決するために promise を使用できますか?

AngularJS 1.3.10 および ocLazyLoad 1.0.5 バージョンを使用しています

getProfile参照用関数

var getProfile = function($q, $http, Profile, localStorageService) {
        var deferred = $q.defer();
        if (!localStorageService.get("loggedInUser")) {
            $http.post('/loggedin').success(function(user) {
                if (user) {
                    localStorageService.set("loggedInUser", user.email)
                    Profile.get(localStorageService.get("loggedInUser"), function(profileData) {
                        if (profileData) {
                            deferred.resolve(profileData);
                        } else {
                            deferred.resolve();
                        }
                    });
                } else {
                    deferred.reject();
                }
            });
        } else {
            Profile.get(localStorageService.get("loggedInUser"), function(profileData) {
                if (profileData) {
                    deferred.resolve(profileData);
                } else {
                    deferred.resolve();
                }
            });
        }
        return deferred.promise;
    }

getProfile.$inject = ["$q", "$http", "Profile", "localStorageService"];
4

3 に答える 3

0

約束getProfileを返しますか?getCountこれが必要なので、これが問題だと思います。挿入されたすべてのオブジェクトresolveは promise を返す必要があります。ドキュメントを参照してください

于 2015-09-24T09:16:30.047 に答える
0

解決を特定の順序で行う必要がある場合は、次のように別の解決に挿入できます。

   when("/dashboard", {
    templateUrl: "dashboard.html",
    resolve: {
        profileData: getProfile,
        count : getCount,
        loadCtrl: ['$ocLazyLoad', 'profileData', 'count', function($ocLazyLoad, profileData, count) {
            return $ocLazyLoad.load(['DashboardCtrl.js']);
        }]
    }
}).
于 2015-09-30T07:52:28.113 に答える