我正在使用Angular Meteor并且我的对象/数组存在问题。我有这段代码:
angular.module("learn").controller("CurriculumDetailController", ['$scope', '$stateParams', '$meteor',
function($scope, $stateParams, $meteor){
$scope.curriculum = $meteor.object(CurriculumList, $stateParams.curriculumId);
$scope.resources = _.map($scope.curriculum.resources, function(obj) {
return ResourceList.findOne({_id:obj._id})
});
console.log($scope.resources)
}]);
我正在尝试迭代资源'这是课程对象中的嵌套数组,查找资源列表中的每个值'收集,并在范围内返回新数组。
问题是,有时它有效,有时它不会。当我加载页面并通过UI路由器链接访问它。我按预期得到了数组。但是如果页面被刷新,$ scope.resources是一个空数组。
我的想法是异步调用有一些问题,但无法找到解决方案。我仍然安装了autopublish包。任何帮助将不胜感激。
答案 0 :(得分:0)
您要做的是返回包含您想要的所有信息的游标,然后如果您愿意,可以在客户端使用$ meteor.object。通常,publishComposite看起来像这样:(我不知道你的课程资源是什么样的)
如果curriculum.resources只有一个id:
,请使用此方法// this takes the place of the publish method
Meteor.publishComposite('curriculum', function(id) {
return {
find: function() {
// Here you are getting the CurriculumList based on the id, or whatever you want
return CurriculumList.find({_id: id});
},
children: [
{
find: function(curr) {
// (curr) will be each of the CurriculumList's found from the parent query
// Normally you would do something like this:
return ResourceList.find(_id: curr.resources[0]._id);
}
}
]
}
})
如果您有多个资源,则使用此方法:
但是,由于您的课程表看起来有一个资源列表,其中包含一个或多个具有id的对象,因此我们需要在返回任何内容之前构建查询。尝试类似:
// well use a function so we can send in an _id
Meteor.publishComposite('curriculum', function(id){
// we'll build our query before returning it.
var query = {
find: function() {
return CurriculumList.find({_id: id});
}
};
// now we'll fetch the curriculum so we can access the resources list
var curr = CurriculumList.find({_id: id}).fetch();
// this will pluck the ids from the resources and place them into an array
var rList = _.pluck(curr.resources, '_id');
// here we'll iterate over the resource ids and place a "find" object into the query.children array.
query.children = [];
_.each(rList, function(id) {
var childObj = {
find: function() {
return ResourceList.find({_id: id});
}
};
query.children.push(childObj)
})
return query;
});
那么应该发生在这里(我没有测试)是有一个发布功能,你将获得你想要的课程,以及所有它的资源列表孩子。< / p>
现在,您可以在客户端访问这些内容。
$scope.curriculum = $meteor.object(CurriculumList, $stateParams.curriculumId);
// collection if more than one, object if only one.
$scope.resources = $meteor.collection(ResoursesList, false);
这种情况有点快,所以我道歉,如果它没有直接工作,任何麻烦我都会帮你解决。