当目标字段名称在变量中时,如何更新数组中的对象?

时间:2014-12-16 14:33:06

标签: javascript jquery mongodb meteor spacebars

我真的很难找到一种方法来构建数据,这将允许服务器上的轻量级更新。

在用户界面上,用户点击插入没有值的对象的添加。

Meteor.methods({
addExp: function() {
    var expDoc = {
        objId: new Mongo.ObjectID,
        field_one: " ",
        field_two: " ",
        field_three: " "
    };
     var newExpId = Meteor.users.update({_id:this.userId}, {$addToSet: {'profile.experiences': expDoc}});
     return newExpId;
}
});

现在,在模板中使用空格键#each block helper,将显示输入字段,并将其value属性分配给这些字段。

{{#with currentUser.profile}}
    {{#each postcards}}
        <input data-name="field_one" id="one" value="{{field_one}}" type="text">
        <input data-name="field_two" id="two" value="{{field_two}}" type="text">
        <input data-name="field_three" id="three" value="{{field_three}}" type="text">
    {{/each}}
{{/with}}

我正在努力做的是将密钥更新发送到特定字段。由于用户可能会向此阵列添加更多明信片,因此我不知道如何定位要更新的特定字段。

在click事件中,我可以获取我想要的目标字段,因为我将此数据放在输入元素var specificField = $(event.target).attr("data-name");

中的data-name属性中

我昨天得到了一个解决方案mongodb query field in object that is being edited,但无法让它发挥作用。

我是否有另一种方法来构建使更新更容易的数据?更新功能类似meteor create --example todos,但它们有一个文档和一个字段,因此这很容易。但是我需要更多的字段而不是&#39;文本&#39;场?

enter image description here

最终,我试图让用户插入包含三个输入元素的表单。每个元素都投影该特定对象的特定字段的当前数据。

1 个答案:

答案 0 :(得分:0)

成功运作!解决方案:将字段名称和值存储为对象! 我将数据存储在“个人档案”集合中,并将特定字段的密钥更新管理到该特定对象。

我将字段名称存储在对象中。 焦点中输入/文本区域的值存储在变量中。 当用户关注输入/ textarea字段时,Session会存储doc的id。

HTML:

{{#each experiences}} // helper to retrieve the docs from Collection
<input data-name="field_one" id="one" value="{{field_one}}" type="text">
<input data-name="field_two" id="two" value="{{field_two}}" type="text">
{{/each}}

client.js

'focus input[type=text], focus textarea[type=text]': function(event) {
 Session.set('DOCID', this._id);

这是在keyup上每5秒调用一次更新方法的事件。

  'keyup input[type=text], keyup textarea[type=text]': _.throttle(function(event) {
    var data = event.target.value;
    var specificField = $(event.target).attr("data-name");
    var keyVal = {};
    keyVal[specificField] = data;
    var docId = Session.get('DOCID');
    Meteor.call('updateExp', docId, keyVal);
  }, 5000),

方法: server.js

  updateExp: function(docId, keyVal) {
    Experiences.update({_id: docId}, {$set: keyVal});
  } 

如果您决定将对象存储在数组中,请执行以下操作。 示例:将对象存储在名为“experience”的数组中 Meteor.user()。profile.experiences。

HTML:

{{#with currentUser.profile}}
{{#each postcards}}
<input data-name="profile.experiences.$.field_one" id="one" value="{{field_one}}" type="text">
<input data-name="profile.experiences.$.field_two" id="two" value="{{field_two}}" type="text">
{{/each}}
{{/with}}
// notice the path and positional operator within the data-name. The positional $ operator 
//will act as a placeholder for the first element (our objId) that matches the query document. The event handler will store the data-name into an object for the update operation.

client.js

'focus input[type=text], focus textarea[type=text]': function(event) {
 Session.set('DOCID', this.objId); 
}

objId是存储Mongo.ObjectID()的字段。 (参考代码有问题)

keyup事件处理程序保持不变。

但是,方法不同。

server.js

updateExp: function(docId, keyVal) {
Meteor.users.update({_id: this.userId, 'profile.experiences.docId': docId }, {$set: keyVal});
}