Parsejs角度/离子检索视图中的关系对象(第二次打开页面时显示的值)

时间:2015-12-18 23:50:44

标签: javascript angularjs parse-platform ionic-framework ionic

我正在使用ng-repeat元素来显示元素列表。每个元素都有一些引用其他对象的Parse.Pointer对象。在我的模板中,当我想显示引用对象的值时,只有当我第一次移动到我的离子应用程序的另一个选项卡然后返回到我想要显示这些值的选项卡时,才会显示该值。

这是我对元素列表的要求:

<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.8/angular.js"></script>
<div ng-app="demoApp" ng-controller="MainController">
  <p>{{myContract.amountOfMoney | currency:default:0}}</p>
  <p class="money">{{myContract.amountOfMoney}}</p>
</div>

这是我如何将值分配给$ scope:

function getFragments(limit){
  var deferred = $q.defer();
  var query = new Parse.Query(Fragment);
  query.limit(limit);
  query.descending('createdAt');
  query.find({
    success: function(results){
        deferred.resolve(results);
    error: function(error){
        deferred.reject(error);
    }
  });
  return deferred.promise;
}

这就是我如何显示在对象中有指针的对象的值(event是指针,name是事件对象的变量):

Fragment.getFragments(20).then(function(fragments){
  $scope.fragments=fragments;
});

列表中每个对象的每个值也都有一个如下定义的get属性:

<ion-item ng-repeat="fragment in fragments">
    <h3>{{fragment.event.name}}</h3>

2 个答案:

答案 0 :(得分:1)

我没有实际运行代码的第一个猜测就是角度不知道有什么东西被更新了。

您需要告诉Angular有些内容已更新,并且必须运行$digest$apply才能更新其范围。

答案 1 :(得分:0)

经过一番挣扎,我找到了多种解决方案。我将描述2。

解决方案1 ​​

对于数组中的每个片段,获取指针的Object。在成功检索对象时,调用$ scope。$ apply()以通知范围的更改。

Fragment.getFragments(20).then(function(fragments){
  angular.forEach(fragments, function(fragment){
    if(fragment.event){
      promises.push(fragment.event.fetch({
        success: function(){
          $scope.$apply();
        }
      }));
    }
  });

但是因为我为每个片段从指针中获取多个对象,所以我想使用promises并在所有promise都被解析时调用$scope.$apply()

    var promises = [];
    if(fragment.user){
      promises.push(fragment.user.fetch());
    }
    if(fragment.artist){
      promises.push(fragment.artist.fetch());
    }
    $q.all(promises).then($scope.$apply());

这向我发出$digest已在进行中的消息,因此我猜$q.all已经启动了$digest 因此,只需使用$q.all(promise)即可解决问题。

解决方案2

查询片段时,在解析Promise之前获取指针的所有对象。

function getFragments(limit) {
  var deferred = $q.defer();
  var query = new Parse.Query(Fragment);
  query.limit(limit);
  query.descending('createdAt');
  query.find({
    success: function (fragments) {
      var promises = [];
      angular.forEach(fragments, function(fragment){
        if(fragment.user){
          promises.push(fragment.user.fetch());
        }
        if(fragment.artist){
          promises.push(fragment.artist.fetch());
        }
      });
      $q.all(promises).then(function(){
        deferred.resolve(fragments);
      });
    },
    error: function (error) {
      console.log('log error');
    }
  });
  return deferred.promise;
}

结论

在我看来,第二种解决方案是最好的,因为最好将数据逻辑保留在控制器之外,不要在数据逻辑中使用$ scope。