2016-04-28 4 views
2

Ich versuche herauszufinden, wie Sie eine Abfrage vom Controller zur Auflösung in Route verschieben.Resolve Response-Header von Abfrage in UI-Route

Im Moment habe ich dies in meinem Controller einige Projekte und die Projekte zählen von einem bestimmten Such/Kriterien zu erhalten Objekt (für Paginierung Zweck)

Projects.query(*{some crit}* ,function (projects, getResponseHeaders) { 
    $scope.projects = projects; 
    $scope.projectsCount = getResponseHeaders('x-total-count'); 
}); 

jetzt, ich möchte diese Abfrage in der zu lösenden Ui Router, also werde ich 'Projekte' und 'projectsCount' bereits zum Controller aufgelöst ... wie kann es gemacht werden?

Antwort

0

Ihre Antwortheader sollten Metadaten sein, aber manchmal ist das immer noch notwendig, wie der ETag-Header. Sie könnten etwas Einfaches wie $scope.projectsCount = $scope.projects.length;

tun. Wenn Sie es unbedingt die Art und Weise tun möchten, schlug ich vor, Ihre aufgelösten Werte in ein Objekt zu verpacken, weil 1) es erfordert weniger Code-Änderung beim Hinzufügen aufgelöster Daten und 2) es ist ziemlich viel notwendig in Ihrer Situation, damit Sie Ihren Service-Anruf nicht zweimal machen.

.state('manage.projects', { 
    url: '/projects', 
    controller: 'ProjectsController', 
    templateUrl: 'projects.html', 
    // 'resolve' functions need to return Q promises, not jQuery promises. 
    resolve: { 
     baseDataResolved: ['$log', '$q', 'Projects', function ($log, $q, Projects) { 
      var qDeferred = new $q.defer(); 
      // Assuming your 'Projects.query' returns a jQuery promise. 
      Projects.query(*{some crit}*) 
      .done(function success(responseData, status_text, jqXHR) { 
       var baseData = { 
        'projects':responseData, 
        'projectsCount':jqXHR.getResponseHeader('x-total-count'), 
       }; 
       qDeferred.resolve(baseData); 
      }) 
      .fail(function failure(jqXHR, status_text, error_thrown) { 
       $log.error(error_thrown); 
       qDeferred.reject(error_thrown); 
      }); 
      return(qDeferred.promise); 
     }], 
    } 
})