[英]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。
对于数组中的每个片段,获取指针的对象。 成功检索对象后,调用$ 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)
解决问题。
查询片段时,请在解决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.