1

标题可能听起来有点奇怪,但就是这样。

代码:

angular.module('app')


.controller('TenantsCtrl', ['$scope', 'tenantsService','$window','loginService', function ($scope, tenantsService, $window, loginService) {
    $scope.mode = "list";
    $scope.g = [];
    $scope.editTenant = {
      firstName: "",
      lastName: "",
      room: "",
      to: "",
      from: ""
    }
    tenantsService.get().then((data) => {
        data.tenants.map((tenant) => {
          tenant.to = new Date(tenant.to).toLocaleDateString('ro-RO')
          tenant.from = new Date(tenant.from).toLocaleDateString('ro-RO')
        });
        console.log(typeof data.tenants);
        $scope.g = data.tenants;
        console.log($scope.g)
      }).catch((reason) => {
        loginService.doLogout();
        if(confirm(`${reason}. Please login`)) {
          $window.location.href="#!/login";
        }
      })
  $scope.showTenantForm = function(tenant) {
    console.log($scope.g)
  }


 }]);

看法:

<div class="page-header">
    <h1>Cazati <button class="btn btn-xs btn-primary" ng-click="showTenantForm()">Cazeaza</button></h1>
</div>
<div class="row"  ng-cloak>
    {{g}}
    <table class="table table-hover">
        <thead>
            <tr>
                <th>Nume</th>
                <th>Camera</th>
                <th>Cazat din</th>
                <th>Cazat pana la</th>
                <th>Cazat de</th>
                <!--<th>Status</th>-->
                <th>Modifica</th>
            </tr>
        </thead>
        <tbody>
            <tr ng-repeat="x in g">
                <td>{{x.lastName}} {{x.firstName}}</td>
                <td>{{x.room}}</td>
                <td>{{x.to}}</td>
                <td>{{x.from}}</td>
                <td></td>
                <td>
                    <button type="button" ng-click="editTenant(tenant.id)" class="btn btn-danger btn-xs">Modifica</button>
                </td>
            </tr>
        </tbody>
    </table>
</div>

问题:表格中的数据未显示。奇怪的是,它只有在按下标题中的按钮并调用函数时才会显示。

来自服务的数据正确。

更新:租户服务

angular.module('app')
.service('graphQLService', ['baseUrl', 'loginService', function (baseUrl, loginService) {
  var graphQLService = {};
  graphQLService.sendQuery = function (query, vars) {
    var self = this;
    vars = vars || {};
    return new Promise(function(resolve, reject) {
      // use fetch to get the result
      fetch(baseUrl + '/gql', {
        method: 'post',
        headers: {
          'Accept': 'application/json',
          'Content-Type': 'application/json'
        },
        body: JSON.stringify({
          query,
          vars,
          authToken: loginService.getToken()
        })
      })

      .then(function(response) {
        var status = response.status;
        if(status != 401) {
          return response.json().then((res) => {
            resolve(res.data);
          })
        } else {
          reject(response.statusText);
        }
        if(response.status == 401) {

        }
      })
      .catch(reject);
    });
  };
  return graphQLService;
}]);
4

2 回答 2

1

在您获得响应并操作数据后添加一个$scope.$apply(),然后将数据分配给您的g范围变量。所以:

$scope.g = data.tenants;
$scope.$apply();

AngularJS 已经在方法中封装了很多代码$scope.$apply。这是为了触发该$scope.$digest方法,该方法负责刷新相关范围内的所有绑定并更新值和视图。例如,如果您使用自定义$http服务,它会在 内部执行$scope.$apply,因此您不需要显式调用它。在您的情况下,您没有使用标准$http,因此您需要手动触发它。

代码在调用另一个函数后工作,因为它ng-click也被包裹在里面$apply,所以它刷新了范围内的所有绑定。

如果您想了解更多关于它的信息,这是一篇非常好的文章:

http://jimhoskins.com/2012/12/17/angularjs-and-apply.html

我希望它有帮助

于 2017-06-04T18:46:11.180 回答
0

我认为问题在于data.tenants.map返回一个新数组。您不保存对它的引用。

你有没有试过这样做

$scope.g = data.tenants.map((tenant) => {
      tenant.to = new Date(tenant.to).toLocaleDateString('ro-RO');
      tenant.from = new Date(tenant.from).toLocaleDateString('ro-RO');
      return tenant;
    });
    console.log(typeof data.tenants);
    console.log($scope.g)
于 2017-06-04T18:03:19.463 回答