我遇到了让Meteor正确更新的问题。我的模板如下:
<template name="hello">
<h1>Hello World!</h1>
<table>
{{#each items}}
{{>demoRow}}
{{/each}}
</table>
</template>
<template name="demoRow">
<tr>
<td>{{order}}</td>
<td>
<input type="text" class="nameChanger" name="demoName-{{name}}" data-demoname="{{name}}" style="width: 90px" value="{{name}}"/>
</td>
</tr>
</template>
脚本文件如下所示:
Template.hello.items = function () {
var entity= Entities.findOne(Session.get('entityId'));
if(entity!=null) {
return Entities.findOne(Session.get('entityId')).items;
}
return null;
};
Template.hello.events({
'change .nameChanger': function(evt) {
var $tgt = $(evt.target)
var entity=Entities.findOne(Session.get('entityId'));
var items = entity.items;
var tgtName = $tgt.data('demoname');
var newName = $tgt.val();
var found=false;
for(var i=0;i<items.length;i++) {
var item=items[i];
if(item.name == tgtName) {
item.name =newName;
found=true;
}
}
if(!found) {
alert("Cannot find ",tgtName);
}
Entities.update({_id: entity._id}, {$set: { items: items}});
},
});
最后,我的初始值设置为:
Entities.insert( { type: 'test',
items: [
{name: 'value1'},
{name: 'value2'},
{name: 'value3'}
]
}
);
这将呈现一个文本输入表。当我更改其中一个文本字段时,它会自动更新实体集合,并且显示屏会显示正确的数据。但是,如果我尝试再次更改同一个字段,我的警报将会触发,因为它无法找到该值。
真正有趣的部分是tgtName
具有原始的,未更改的值。但是,evt.target具有使用新名称的正确,更新的数据集。我甚至可以通过evt.target.dataset['demoname']
获得正确的名称,这是我现有的解决方法。
我的问题是,为什么ID $tgt.data()
没有保存更新的值?
我应该提一下,这会适当地更新其他窗口,如果我在一个窗口中更新它然后在另一个窗口中更新相同的值,它确实可以正常工作,第一次。在那之后,两个窗口似乎都存放了第一次更新时的价值。这几乎就像某种范围问题,但我无法弄清楚在哪里。
由于
答案 0 :(得分:0)
猜测,但也许更新是做错了。也许您可以尝试更新单个编辑的项目。试试这个:
Template.hello.events({
'change .nameChanger': function(evt) {
var $tgt = $(evt.target)
var entity=Entities.findOne(Session.get('entityId'));
var items = entity.items;
var tgtName = $tgt.data('demoname');
var newName = $tgt.val();
var found=false;
for(var i=0;i<items.length;i++) {
var item=items[i];
if(item.name == tgtName) {
item.name =newName;
found=true;
break;
}
}
if(!found) {
alert("Cannot find ",tgtName);
}
else
Entities.update({_id: entity._id}, {$set: { 'items.' + i.toString(): item}});
},
});
有点笨重,但也许......
答案 1 :(得分:0)
这是jQuery与Meteor(或任何其他试图修改数据属性的东西)的限制
数据属性在第一次访问数据属性时被拉出,然后不再被访问或变异(所有数据值都在内部存储在jQuery中)。
所以,选项是不使用jQuery并按照规定访问evt.target.dataset['demoname']
,或者使用jQuery.attr()
$tgt.attr("data-demoname")
感谢流星的mizzao和dgreensp寻求帮助(https://github.com/meteor/meteor/issues/2329)