Angularjs $http.get().then and binding to a list

前端 未结 4 1606
借酒劲吻你
借酒劲吻你 2020-12-03 00:26

I have a list that looks like this:

  • 相关标签:
    4条回答
    • 2020-12-03 01:12

      Try using the success() call back

      $http.get('/Documents/DocumentsList/' + caseId).success(function (result) {
          $scope.Documents = result;
      });
      

      But now since Documents is an array and not a promise, remove the ()

      <li ng-repeat="document in Documents" ng-class="IsFiltered(document.Filtered)"> <span>
                 <input type="checkbox" name="docChecked" id="doc_{{document.Id}}" ng-model="document.Filtered" />
              </span>
       <span>{{document.Name}}</span>
      
      </li>
      
      0 讨论(0)
    • 2020-12-03 01:21

      $http methods return a promise, which can't be iterated, so you have to attach the results to the scope variable through the callbacks:

      $scope.documents = [];
      $http.get('/Documents/DocumentsList/' + caseId)
        .then(function(result) {
          $scope.documents = result.data;
      });
      

      Now, since this defines the documents variable only after the results are fetched, you need to initialise the documents variable on scope beforehand: $scope.documents = []. Otherwise, your ng-repeat will choke.

      This way, ng-repeat will first return an empty list, because documents array is empty at first, but as soon as results are received, ng-repeat will run again because the `documents``have changed in the success callback.

      Also, you might want to alter you ng-repeat expression to:

      <li ng-repeat="document in documents" ng-class="IsFiltered(document.Filtered)">
      

      because if your DisplayDocuments() function is making a call to the server, than this call will be executed many times over, due to the $digest cycles.

      0 讨论(0)
    • 2020-12-03 01:23

      Actually you get promise on $http.get.

      Try to use followed flow:

      <li ng-repeat="document in documents" ng-class="IsFiltered(document.Filtered)">
          <span><input type="checkbox" name="docChecked" id="doc_{{document.Id}}" ng-model="document.Filtered" /></span>
          <span>{{document.Name}}</span>
      </li>
      

      Where documents is your array.

      $scope.documents = [];
      
      $http.get('/Documents/DocumentsList/' + caseId).then(function(result) {
          result.data.forEach(function(val, i) { 
              $scope.documents.push(/* put data here*/);
          });
      }, function(error) {
          alert(error.message);
      });                       
      
      0 讨论(0)
    • 2020-12-03 01:25

      Promise returned from $http can not be binded directly (I dont exactly know why). I'm using wrapping service that works perfectly for me:

      .factory('DocumentsList', function($http, $q){
          var d = $q.defer();
          $http.get('/DocumentsList').success(function(data){
              d.resolve(data);
          });
          return d.promise;
      });
      

      and bind to it in controller:

      function Ctrl($scope, DocumentsList) {
          $scope.Documents = DocumentsList;
          ...
      }
      

      UPDATE!:

      In Angular 1.2 auto-unwrap promises was removed. See http://docs.angularjs.org/guide/migration#templates-no-longer-automatically-unwrap-promises

      0 讨论(0)
    提交回复
    热议问题