1

我有一个 REST 服务,它返回一个 json 字符串,它只是一组字符串(我使用 Gson 生成这个字符串(Gson.toJson(mySetOfStrings))

所以我已经添加到我的 index.html 中:

<div ng-controller="ListOptionsCtrl">
  <form novalidate>
    <button ng-click="refreshList()">refresh</button>
    <select name="option" ng-model="form.option" ng-options="o.n for o in optionsList></select>
  </form>
</div>

在我的脚本中:

var ListOptionsCtrl = function ListOptionsCtrl($scope, $http) {
  $scope.refreshList = function() {
    $http({ 
      method: 'GET'
      url: '*someurl*'
    }).
      success(function(data) {
        $scope.optionsList = angular.fromJson(data);
    });
  };
}

不幸的是,在我的选择框中产生的所有这些都是一个空列表。当我看到对 GET 请求的响应是什么时,它会返回一个包含内容的 json 字符串,所以我不明白为什么没有向这个元素添加任何内容。我在这里做错了什么?谢谢

4

2 回答 2

0

这是因为 Angular 还不知道您的更改。因为 Angular 允许将任何值用作绑定目标。然后在任何 JavaScript 代码循环结束时,检查值是否已更改。

您需要使用 $apply

var ListOptionsCtrl = function ListOptionsCtrl($scope, $http) {
  $scope.refreshList = function() {
    $http({ 
      method: 'GET'
      url: '*someurl*'
    }).
      success(function(data) {
        $scope.$apply(function () {
            $scope.optionsList = angular.fromJson(data);
        });
    });
  };
}

尝试这个。

更多关于它是如何工作的以及为什么在Jim Hoskins 的帖子中需要它

于 2013-08-30T06:11:22.803 回答
0

您应该在执行 $apply 之前执行 if(!$scope.$$phase) { ... } 检查 $digest 错误。

success(function(data) {
     if(!$scope.$$phase) {
        $scope.$apply(function () {
            $scope.optionsList = angular.fromJson(data);
        });
      }
    });
于 2013-12-06T14:15:03.033 回答