2013-07-19 27 views
13

Tôi đã có một quyết tâm làm việc trên routeprovider của tôi nhưng tôi chỉ trả lại lời hứa vì vậy tôi không biết nếu thành công hay thất bại của nó. Đây là những gì tôi cóAngularJS: Giải quyết trong RouteProvider - phát hiện thành công/thất bại?

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

Bây giờ điều này không làm việc nhưng làm thế nào để phát hiện sự thành công hay thất bại ... tôi có thể nhập này trong phương pháp giải quyết, nhưng những gì tôi sẽ quay trở lại trong sự thành công và thất bại ... Nhớ Tôi cần phải có các mục tiêm trong bộ điều khiển của tôi.

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

Tôi đã xem ví dụ ở đây nhưng tôi nhầm lẫn nếu đây là những gì tôi cần và cách sử dụng?

AngularJS - rejected $http promise with $routeProvider:resolve

Có vẻ như đã trả về lời hứa thủ công.

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; 
     } 
    ] 
} 

Tôi thực sự đánh giá cao sự giúp đỡ của bất kỳ ai. Những gì tôi thực sự muốn làm là trong bộ điều khiển của tôi có biến giải quyết được tiêm vào bộ điều khiển, nếu nó không thành công thì tôi cũng muốn có quyền truy cập vào sự thất bại trong bộ điều khiển để tôi có thể hiển thị cho người dùng rằng nó không được không thể hiển thị do sự cố.

Trả lời

10

Bạn chỉ có thể trả về giá trị trả về của phương then:

resolve: { 
    resolvedData: function(Restangular){ 
     return Restangular.one('Items').get().then(function (data) { 
      ... 
      return successData; // resolvedData will be resolved with the successData 
      }, function() { 
      ... 
      return failureData; // resolvedData will be resolved with the failureData 
      }); 
    } 
} 

Các then phương pháp doc:

Phương pháp này trả về một lời hứa mới được giải quyết hoặc từ chối thông qua các giá trị trở lại của successCallback hoặc errorCallback.

+1

Ah điều đó tuyệt vời, và trong bộ điều khiển của tôi làm thế nào tôi sẽ xác định nếu giá trị tôi đang tiêm là thành công hay thất bại? – Martin

+2

Trả về một đối tượng như {success: true, data: ...} –

2

Nếu chức năng phân giải thất bại, có thể bạn sẽ muốn hiển thị cho người dùng một điều gì đó tương ứng (như thông báo lỗi). Sẽ tốt hơn nếu để chức năng giải quyết của bạn trả lại lời hứa (không có then) và sử dụng sự kiện nội bộ $routeChangeError.

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

])

Nó cũng sẽ dễ dàng hơn để đối phó với lỗi chung chung (như mạng lỗi/máy chủ xuống vv).

Các vấn đề liên quan