繁体   English   中英

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

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

我正在使用ng-repeat元素显示元素列表。 每个元素都有一些引用其他对象的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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM