JSON解析不适用于ng-repeat

时间:2016-01-02 21:14:00

标签: javascript angularjs json ionic-framework ng-repeat

所以我使用Ionic,angular和ngCordova。我试图加载一个JSON文件,我通过对象数组的JSON.stringify()保存了该文件。我有一个工厂,它拥有这个对象数组,基本上我有一个主页路由,通过数组重复显示对象。

加载工作正常,理论上解析器也是如此;我的HTML看起来像这样:

<ion-content ng-controller="HomePageControl">
{{posts}}
<ul class="list" ng-repeat="post in posts | limitTo:25">
  <a nav-direction="forward" class="item" ui-sref="entry({postID:$index})">
    {{post.text}}
  </a>
</ul>
<button class="button" ng-click="update()">Update</button>

所以&#34;帖子&#34;是我的$ scope.posts对象;你可以看到我在列表之前和列表中加载它(我在Android上工作,这基本上是我可以调试的唯一方法)。我还有一个按钮,更新&#34; (重新加载json并将帖子设置为等于工厂中的帖子)数据。

我的HomePageControl看起来像这样:

.controller('HomePageControl', function($scope, postsFactory){
postsFactory.updatePosts();
  $scope.posts=[];
  postsFactory.readPosts().then(function(data) {
    $scope.posts = postsFactory.getPosts();
  })
  $scope.update=function(){
    postsFactory.updatePosts();
    $scope.posts= postsFactory.getPosts();
  }


})

所以,这里的问题是{{posts}}吐出正确的解析对象,看起来像这样,除了在文本中:

[{"text":"mreow"},{"text":"text"},{"text":"WORK"}]

但是ng-repeat DOESN&T; TTH ANTHTHING。它只是空白。 但是,当我按下“更新”按钮几次时,它会显示列表,但文本没有任何变化。它在postsFactory中基本上都是相同的代码。

postsFactory:

.factory('postsFactory', function($cordovaFile,$ionicPlatform,$ionicPopup){
  var posts = [];
  var factory = {};
  factory.getPosts=function(){
    return posts;
  }
  factory.readPosts=function(){
      return $ionicPlatform.ready(function(){}).then(function(first){
        return $cordovaFile.readAsText(cordova.file.externalDataDirectory, "posts.json");
      }, function(error){
        return error + "not ready";
      }).then(function (second) {
          posts=JSON.parse(second);

         return posts;
      },function(error){
        return error + "Error reading";
      });
  }

  factory.updatePosts=function(){
    $ionicPlatform.ready(function() {
      $cordovaFile.readAsText(cordova.file.externalDataDirectory, "posts.json")
       .then(function (success) {
          posts=JSON.parse(success);
       }, function (error) {
         var alertPopup = $ionicPopup.alert({
            title: 'Error',
            template: 'Could not read file'
          });
       });
   });
  }
  return factory;
})

tldr;我的解析有效,但是ng-repeat并没有接受它。 有什么想法吗?

2 个答案:

答案 0 :(得分:1)

当您处理异步方法时,它正在执行一些异步操作并将promise对象返回给使用者函数。基本上你需要放置.then服务方法调用的getPosts函数。因此,一旦从getPosts方法返回数据,它将调用您.then的成功/错误/捕获函数取决于promise对象resolved/reject/error occured while processing request

postsFactory.getPosts().then(function(posts){
   $scope.posts = posts;
})

答案 1 :(得分:0)

因此,经过一些进一步的实验,我找到了问题的根源:它没有正确读取JSON,因为它没有正确编写。我通过替换JSON文本找到了这个,并且所有内容都很好。因此,要解决此问题,我使用angular.toJson(object)方法替换了JSON.stringify(object)函数。

因此,对于那些有同样问题的人,我的保存脚本如下所示:

factory.newPost=function(post){
      posts.push(post);
      $ionicPlatform.ready(function() {
          $cordovaFile.writeFile(cordova.file.externalDataDirectory, "posts.json", angular.toJson(posts), true).then(function (success) {

          });
      });
    }

干杯