2016-03-13 34 views
-1

即使条件在块的执行位置处计算为false,此代码仍未能将字段“class”的值设置为“wrongInput”。 目的是更新的字段“类”未被转换的流星汇集

编辑因此中继上流星更新表达式{{类}}在上模板的reactiveness。如何才能做到这一点?感谢

meteor:PRIMARY> db.inputsCol.find({}).pretty(); 
 
{ 
 
\t "_id" : "L9nrmjaoG6RAdxeqd", 
 
\t "element" : "input", 
 
\t "action" : "orderFood", 
 
\t "name" : "plate", 
 
\t "placeholder" : "Enter plate number", 
 
\t "valid" : "^[0-9a-zA-Z]{1,6}$", 
 
\t "value" : "KingKong", 
 
\t "class" : ""    <---- expected value is "wrongInput" 
 
} 
 

 
G.InputsCol = new Mongo.Collection('inputsCol', { 
 
    transform: function (doc) { 
 
    var patt = new RegExp(doc.valid, "g"); 
 
    if (!patt.test(doc.value)) { 
 
     console.log('block run'); 
 
     doc.class = "wrongInput"; <---- This line --------------------------- 
 
    } 
 
    return doc; 
 
    } 
 
}); 
 

 
Template.index.helpers({ 
 
taskInputs: function() { 
 
    var ready = Meteor.subscribe('inputsCol').ready(); 
 
    var data = InputsCol.find({}); 
 
    return {items: data, ready: ready}; 
 
    } 
 
});

+3

收集转换仅在获取文档时运行。他们不修改数据库中的文档。要测试转换,您需要在客户端或服务器上执行以下操作:'console.log(G.InputsCol.findOne('L9nrmjaoG6RAdxeqd')。class)' –

+0

在浏览器控制台中写入此命令会提供输出如预期的字符串“wrongInput”,但然后mongo终端显示“class”字段没有值。另外,代码的其余部分会导致块被执行,正如我在编辑中由控制台日志“验证”所述,但“doc.class =”wrongInput“行不会导致值被”插入“文档中如在mongo控制台验证的那样,即使应用程序第一次启动时,“块运行”也会触发,但不会插入“wrongInput”字符串 –

+0

是的,它的行为与预期的一样,请参阅我以前的评论的第一行。要写回到数据库,你需要一个钩子代替 –

回答

0

A之后查找/取变换动态应用。只要value字段发生更改,您正在修改数据库中的文档。有几种方法可以做到这一点。一种方法是确保在任何代码插入或更新文档中正确更新。或者,你可以添加一个hook像这样:

G.InputsCol = new Mongo.Collection('inputsCol'); 

G.InputsCol.before.insert(function (userId, doc) { 
    var patt = new RegExp(doc.valid, 'g'); 
    if (!patt.test(doc.value)) 
    doc.class = 'wrongInput'; 
}); 

G.InputsCol.before.update(function (userId, doc, fieldNames, modifier) { 
    if (_.contains(fieldNames, 'value')) { 
    var patt = new RegExp(doc.valid, 'g'); 
    if (!patt.test(doc.value)) { 
     modifier.$set = modifier.$set || {}; 
     modifier.$set.class = 'wrongInput'; 
    } 
    } 
}); 

注意上面的代码是未经测试,但这个想法是,在插入或收集的更新,文档会自动修改其class场。您需要meteor add matb33:collection-hooks才能使其工作。

+0

谢谢。我单独使用了.update,它更新了字段类的值“wrongInput”。反应行为是否仍然有效?因为模板中使用此值的{{class}没有得到更新。thx –

+0

应该是。钩子应该运行,就好像其他代码已经修改了值一样。如果它出现在你的dat但基本没有出现在客户端,那么也许这是一个无关紧要的问题。 –