角度流星对象未按预期运行

时间:2015-10-18 17:26:31

标签: angular-meteor

我正在使用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包。任何帮助将不胜感激。

1 个答案:

答案 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);

这种情况有点快,所以我道歉,如果它没有直接工作,任何麻烦我都会帮你解决。