我真的很难找到一种方法来构建数据,这将允许服务器上的轻量级更新。
在用户界面上,用户点击插入没有值的对象的添加。
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");
我昨天得到了一个解决方案mongodb query field in object that is being edited,但无法让它发挥作用。
我是否有另一种方法来构建使更新更容易的数据?更新功能类似meteor create --example todos
,但它们有一个文档和一个字段,因此这很容易。但是我需要更多的字段而不是&#39;文本&#39;场?
最终,我试图让用户插入包含三个输入元素的表单。每个元素都投影该特定对象的特定字段的当前数据。
答案 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});
}