13

routeprovider で解決策が見つかりましたが、約束を返すだけなので、成功か失敗かはわかりません。これは私が持っているものです

.when('/items', {
    templateUrl: 'views/items.html',
    controller: 'ItemsCtrl',
    resolve: {
        resolvedData: function(Restangular) {
            return Restangular.one('Items').get();
        }
    }
})

これで機能しますが、成功または失敗をどのように検出しますか。これを resolve メソッドに入力することもできますが、成功と失敗で何を返すのでしょうか。コントローラーにアイテムを注入する必要があることを思い出してください。

.when('/items', {
    templateUrl: 'views/items.html',
    controller: 'ItemsCtrl',
    resolve: {
        resolvedData: function(Restangular) {
            Restangular.one('Items').get().then(function(data) {
                // success
            }, function() {
                // failure
            });
        }
    }
})

ここで例を見ましたが、これが必要なものであり、どのように使用するのか混乱していますか?

AngularJS - $routeProvider:resolve で $http の約束を拒否しました

手動の約束を返しているようです。

resolve: {
    response: ['Warranty'
        '$q',
        function(Warranty, $q) {
            var dfd = $q.defer();
            Warranty.sendRequest().then(function(result) {
                dfd.resolve({
                    success: true,
                    result: result
                });
            }, function(error) {
                dfd.resolve({
                    success: false,
                    reason: error
                });
            });
            return dfd.promise;
        }
    ]
}

私が本当にやりたいことは、コントローラーに解決された変数をコントローラーに注入することです。失敗した場合は、コントローラーの失敗にもアクセスして、ユーザーに不可能であることを表示できるようにしたいと思います。問題によりレンダリングされます。

4

2 に答える 2

3

解決関数が失敗した場合、それに応じて何か (エラー メッセージなど) をユーザーに表示する必要があります。thenresolve 関数が promise を ( なしで) 返すようにし、 internal event を使用する方がよいでしょう$routeChangeError

myApp.run(['$rootScope',function($rootScope) {
  $rootScope.$on('$routeChangeError', function() {
    // what you want to do if an error occurs 
    // ex: $rootScope.displayErrorMessage = true
  });

]))

また、一般的なエラー (ネットワーク エラーやサーバー ダウンなど) の処理も容易になります。

于 2016-01-09T10:40:10.517 に答える