this.userId是未定义的MongoDB属性,在提交后未插入

时间:2013-03-03 14:41:12

标签: javascript mongodb meteor

我的客户端文件中有以下事件:

Template.categories.events({
...

  'keyup #add-category': function (e,t){
    if (e.which === 13)
    {
      var catVal = String(e.target.value || "");
      if (catVal)
      {
        lists.insert({Category:catVal,owner:this.userId});
        Session.set('adding_category', false);
      }
    }
  },
  ...
});

这是相关的模板部分:

<template name="categories">
    <div id="categories" class="btn-group">
        {{#if new_cat}}
        <div class="category">
            <input type="text" id="add-category" value="" />
        </div>

        {{else}}
        <div class="category btn btn-inverse" id="btnNewCat">&plus;</div>
        {{/if}} 
        {{#each lists}}
        <div class="category btn {{list_status}}" id="{{_id}}">     
            {{Category}}
        </div>
        {{/each}}
    </div>
</template>

因此,当插入新的类别时,应该设置所有者..但它不会。

这是MongoDB中的条目:

> db.lists.find()
{ "Category" : "test-admin", "_id" : "EsybjC3SLnNzCBx2t" }

知道我做错了什么吗? (实际上我正在关注“流星入门”图书借阅图书馆的例子

编辑似乎:

console.log(this.userId);
undefined

3 个答案:

答案 0 :(得分:1)

this可能不是您希望它在该事件中的内容。您应该调试以确认是这种情况。您可能只是this.userId未定义。我建议将this分配给此事件处理函数之外的变量(称为“self”或“that”),但在this将成为您实际想要的范围内。然后,您可以在事件处理程序中引用该变量。

它应该是这样的:

function thatRegistersEvents() {
    var self = this;

    // ...

    registerSomeEvent(function () {
        return self.someThisProperty;
    });
}

答案 1 :(得分:1)

交换此行:

lists.insert({Category:catVal,owner:this.userId});

到这一个:

lists.insert({Category:catVal,owner:Meteor.userId()});

答案 2 :(得分:0)

这是正确的行为。如果您阅读官方Meteor文档以获取对this.UserId的引用,则仅在Meteor.publish()Meteor.methods()中提供。您在上面的代码示例中完成的this.UserId中未提供Meteor.template(),因此必须在模板中使用Meteor.userId()