Parsejs angular/ionic在视图中检索关系对象(第二次打开页面时显示值)
Parsejs angular/ionic retrieving relational object in view (values getting displayed when page is opened for the second time)
我正在使用一个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。
相关文章:
- 推特引导:弹出窗口不会在第一次点击时出现,但会在第二次点击时显示
- 拖动效果不会第二次显示
- 如何在访问者第二次单击链接时显示不同的页面
- 如何在第一次点击时突出显示链接;并在第二次单击时跟随它,除非在其他地方单击,然后重新初始化未高亮显示的状态
- AngularJS 在第二次渲染时显示大括号
- 日期选择器 getDate 方法在第二次单击时工作并显示上一个选定的日期
- Ajax 对对话框窗口的响应在第二次尝试时不显示更改的值
- 当我第二次运行我的应用程序时,结果没有显示
- jQuery UI 对话框 - 第二次显示未选择的文本
- 奇怪的是,在第二次单击切换隐藏/显示按钮而不是第一次单击后,有两行有效
- 显示/隐藏脚本无法在第二次单击时再次隐藏
- 当我第二次单击链接时如何显示面板
- Marionette没有't在第二次显示父视图时渲染子视图
- Parsejs angular/ionic在视图中检索关系对象(第二次打开页面时显示值)
- 工具提示显示在第二次悬停之后
- BrowserSync显示第二次刷新后的更改
- AngularJS-第一次运行.service计划发送数据,但没有显示,第二次运行,没有发送数据的计划,但显示了一些
- 在javaScript中第二次单击按钮时显示警报
- 第二次显示的时间问题.的帮助
- 得到& # 39;未定义# 39;当尝试第二次显示用户输入时