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。
我正在使用 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。