0

流星新手在这里。根据 Todos 示例,我正在尝试使用单独的标签集合。除了一个奇怪的 UI 工件之外,它似乎正在工作:如果我在标签过滤器中单击一个标签,并检查待办事项列表中的最后一项,那么第一项也会被选中。第一项没有更新为完成,并且单击远离标签过滤器然后返回显示第一项未选中,因为它应该是。所以我不确定为什么会这样。

待办事项的代码与待办事项示例中的代码相同

    {{#each todos}}
      {{> todo_item}}
    {{/each}}

以及标签收集过滤器的代码

    var todos = [];
    if (!currentTaskId)
      return {};

    var tag_filter = Session.get('tag_filter');
    if (tag_filter){
     var tags = Tags.find({taskId: currentTaskId, name: tag_filter});
     tags.forEach(function(tag){
       var todo = Todos.findOne(tag.todoId);
       todos.push(todo);
     });
     return todos; // this is an array rather than a collection and causes a strange artifact bug when checking bottom todo as done    
    }

我能够收集到的是,如果您在数组上执行 {{#each}} ,则会创建对整个范围而不是数组中每个单独项目的依赖项,而不是自动为每个文档创建依赖项的集合游标在集合中。有人遇到过这种奇怪的 UI 行为吗?我还想知道是否有一种方法可以使数组成为游标,或者至少通过为数组中的每个项目注册一个依赖项来表现得像一个游标?

感谢任何见解,谢谢。

4

1 回答 1

1

我已经修改了您的代码以返回游标而不是数组,它可能会解决您的问题,但它未经测试。

var tagFilter=Session.get("tag_filter");
if(!currentTaskId || !tagFilter){
    return null;
}
// find tags and fetch them in an array
var tags=Tags.find({
    taskId:currentTaskId,
    name:tagFilter
}).fetch();
// build an array of Todos ids by extracting the todoId property from tags
// see underscore docs
var todosIds=_.pluck(tags,"todoId");
// return todos whose id is contained in the array
return Todos.find({
    _id:{
        $in:todosIds
    }
});
于 2013-09-13T00:44:46.287 回答