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

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

本文关键字:第二次 显示 对象 ionic angular 视图 关系 检索 Parsejs      更新时间:2023-09-26

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

这是我对元素列表的呼吁:

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

对于数组中的每个片段,获取指针的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();
        }
      }));
    }
  });

但是,由于我要为每个片段从指针中获取多个对象,所以我想使用promise,并在解析所有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。