Parsejs angular/ionic 在视图中检索关系对象(第二次打开页面时显示的值)

Parsejs angular/ionic retrieving relational object in view (values getting displayed when page is opened for the second time)

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

这是我对元素列表的调用:

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;
}

这就是我将值分配给 $scope 的方式:

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

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

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

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

Fragment.prototype.__defineGetter__('event', function(){
  return this.get('event');
});

我的第一个猜测,实际上 运行 宁代码将是 angular 不知道更新了什么。

您需要告诉 Angular 某些内容已更新并且它必须 运行 $digest$apply 也更新它的范围。

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

解决方案 1

对于数组中的每个片段,获取指针的对象。成功检索对象调用 $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();
        }
      }));
    }
  });

但是因为我要从每个片段的指针中获取多个对象,所以我想使用承诺并在所有承诺都已解决时调用 $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。