0

angularjs が ngResource カスタム URL で動作しないという事実のため、代わりに $http を試す必要があります。

私のhtmlは次のようなものです:

//html
<tr ng-repeat="person in people">
  <td>{{person.name}}</td>
  <td><a ng-click="changeGender(person)">{{person.gender}}</a></td>
</tr>

私の考えは、html のアンカーをクリックした後、リクエストがサーバーに送信されて更新され、ステータスが 200 で返され、ビューの性別が更新されるというものです。サービスを構築すると、次のようになります。

//factory
app.factory('changeGenderFactory', function($http, $q){
  return {
    getResult: function(person) {
      var deferred = $q.defer();
      $http({method: 'POST', url: '/resources/people/' + person.id + '/gender'}).
      success(function(data, status, headers, config){
        deferred.resolve(data);
      }).
      error(function(data, status, headers, config){
        deferred.reject(status);       
      });
      return deferred.promise;
    }
  };
});

これはコントローラーです:

//app
var app = angular.module('someApp', []);
//controller
app.controller('peopleCtrl', function($scope, ngResource, changeGenderFactory) {
  //skip how i get $scope.people...
  //$scope.people = ...(use ngResource)

  $scope.changeGender = function(person) {
    return changeGenderFactory.getResult(person);
  };
});

ajax は正常に動作していますが、html がまったく更新されていないため、コントローラー部分に何か問題があると思います。html で ng-repeat のデータを更新するにはどうすればよいですか? ありがとうございました。

4

1 に答える 1

1

結局、私は ngResource の使用をあきらめ、代わりに $http と $q に目を向けました。この場合、ngResource は完全には適合しません。基本的に、これは私が問題を解決する方法です:

HTMLで:

{{changeGender(person, $index)}}

追加のパラメーター $index を渡すことで、この場合は誰なのかを知ることができます。次に、コントローラーで:

$scope.changeGender = function(person, index) {
  //using $http, can move to service with $q, just for demo
  $http.post('someurl').success(function(data){
    $scope.people[index] = data;
  });
}

不器用に見えるかもしれませんが、代替手段です....

于 2013-07-03T04:12:25.850 に答える