【问题标题】:Return arrays from meteor mongo从流星蒙戈返回数组
【发布时间】:2015-04-06 06:43:18
【问题描述】:

ajduke:bootstrap-tagsinput

我正在使用上面的包来创建一个标签系统。我使用了上面链接中的True Input Value 中的<select multiple>,并将每个标签作为Strings 插入到tag array 中。

这就是我的数据库的样子。

Posts
    tags              //Array
        [0] : sometag //String
        [1] : sometag //String
        [2] : sometag //String
                      //and so forth..

所以我的问题是... 我想将帖子中的所有标签恢复为以下格式,以便在我的用户尝试编辑他们的帖子时重复使用它来显示标签。

想要的格式

['sometag', 'sometag', 'sometag', and so forth]

编辑1

这是我到目前为止所做的。

Post_Edit.js

Template.postEdit.rendered = function() {
    myTags = Posts.findOne({_id: this._id}).tags.fetch(); //AAA
    
    $('.tagsinput').tagsinput('add', myTags); //From above link API
}

我已经为//AAA 线尝试了其他方法,但我没有运气。我尝试过诸如Posts.findOne.map... 之类的东西,也许我的英语理解达不到标准,但流星中的文档并没有帮助我理解更好。

编辑 2

Posts.findOne({_id: "ziZw3wLaxFyz3DYP4"}).tags 我已经尝试将它放在浏览器控制台中,并以我想要的格式获得数组。

但问题是,当我使用它时,它在我的应用程序中不起作用。

当我在 postEdit.rendered 中使用 Posts.findOne({_id: this._id}).tags 时,我收到此浏览器控制台错误。 Cannot read property 'tags' of undefined Post_Edit.js

Template.postEdit.rendered = function() {
    myTags = Posts.findOne({_id: this._id}).tags;

    
    $('.tagsinput').tagsinput('add', myTags); //From above link API
}

我不明白为什么它可以在浏览器控制台中运行,而不是我的 Template.postEdit.rendered?

【问题讨论】:

  • 您尝试过什么来实现这一目标?你做了什么研究?现在看起来你只是要求解决方案而不是自己投资。
  • @Kyll 我在过去的几个小时里一直在尝试解决这个问题。我将更新我的问题,以便展示我未能实现的目标。我没有在这里输入我的意见,因为我很确定我走错了方向。
  • 谢谢。这对我们来说非常重要。即使你认为你走错了路,它也会表明你已经在这件事上进行了投资(因此不仅仅是要求免费代码),我们可以看到你的推理,哪里出了问题以及为什么,并重定向你到更好的方式。它还可以帮助未来的读者从你的失败中吸取教训!
  • @Kyll 感谢您的指点。从现在开始,我也会为将来的问题这样做。我不久前才开始编程,我正在一个不像其他国家那样偏爱流星或新技术的国家自学。这里 90% 的人使用 php 和 mysql。我总是很高兴在 Stackoverflow 中得到答案!
  • 当您尝试对其进行查询时,Posts 集合可能还没有准备好......但在这种情况下,Posts.findOne({_id: this._id}).tags 会抛出。那么它会抛出吗?

标签: javascript jquery arrays mongodb meteor


【解决方案1】:

在调用 Template.postEdit.rendered 时未定义变量 myTags 是正确的,因为调用函数时 Posts 数据库尚未完成加载。

myTags = Posts.findOne({_id: this._id}).tags.fetch(); //AAA

解决方案
有多种策略,包括:

  1. 订阅完成后更新 DOM
    http://docs.meteor.com/#/full/Blaze-TemplateInstance-subscribe

  2. Collection改变时重新运行函数
    http://docs.meteor.com/#/full/tracker_autorun

    Template.postEdit.rendered = function() {
       Tracker.autorun(function () {  ** NEW LINE **
          myTags = Posts.findOne({_id: this._id}).tags; 
    
          $('.tagsinput').tagsinput('add', myTags); 
       } ** NEW LINE **
    }
    

【讨论】:

    【解决方案2】:

    我采用了一种完全不同的方法来解决这个问题。 但是我还是想知道为什么我的方法不起作用...

    post_edit.js

    Template.postEdit.helpers({
        tags: function(){
            Posts.findOne({_id:this._id}).tags;
        }
    });
    

    post_edit.html

    <select class=tagsinput id="tagsinput" data-role="tagsinput">
        {{#each}}
            <option value="{{this}}">{{this}}</option>
        {{/each}}
    

    【讨论】:

    • 您的rendered 回调(顺便说一句,如果您执行meteor update,它将是onRendered)不是反应式的:它运行一次。然而,助手是反应式的,每次身体中使用的反应式数据发生变化时,它们都会重新运行;并且客户端集合查询是反应式的。
    • @Kyll 那么这是否意味着渲染在数据加载之前启动?
    • @Kyll 对于onRendered 回调,我仍在使用渲染,因为我注意到如果我使用onRendered,我的一些包会损坏。我知道它仍然受支持。我只希望这些软件包尽快更新。 (我真的不知道为什么它会破坏但将 onRendered 更改为 render 会解决问题......)
    • rendered 尽快启动,它不会关心数据AFAIK。
    • @Kyll 谢谢 :) 我学到了很多东西。我需要学习如何使用Deps.autorun 及其优缺点。但是现在,我很高兴我知道了这一点!我将暂时避免使用rendered 的数据相关代码。永远感谢您在Meteor 相关主题上的cmets。
    猜你喜欢
    • 2013-08-21
    • 2013-09-27
    • 1970-01-01
    • 1970-01-01
    • 2015-07-17
    • 1970-01-01
    • 1970-01-01
    • 2019-02-10
    • 2019-02-03
    相关资源
    最近更新 更多