在我的Meteor应用程序中,我有一个名为 relatedSentences 的简单数组字段。它是使用SimpleSchema
定义的 relatedSentences: {
type: [String],
label: "Related Sentence",
optional: false,
defaultValue: []
},
可以在Mongo控制台中看到它的数据:
"_id" : "ei96FFfFdmhPXxRWb",
"sentence" : "the newest one",
"relatedSentences" : [
"Ls6EyBkbcotcyfLyw",
"6HKQroCjZhG9YCuBt"
],
"createdAt" : ISODate("2015-10-25T11:21:25.338Z"),
"updatedAt" : ISODate("2015-10-25T11:41:39.691Z")
但是当我尝试使用 this 访问此字段时,它将作为原始字符串返回。
Template.showSentence.helpers({
translations: function() {
console.log("related: " + this.relatedSentences);
Meteor.subscribe('sentences', function() {
var relatedSentences = Sentences.find({_id: {$in: this.relatedSentences} }).fetch();
console.log("rel count" + relatedSentences.length);
return relatedSentences;
});
}
});
在控制台中我收到错误消息。查看this.relatedSentences的返回值。它是数组的内容,作为字符串,插入逗号。
related: Ls6EyBkbcotcyfLyw,6HKQroCjZhG9YCuBt
selector.js:595 Uncaught Error: $in needs an array
不确定这里发生了什么。
一些进展
我取得了一些进展,但尚未找到解决方案。通过将 blackbox:true 添加到SimpleSchema定义中,现在返回看起来像数组的内容......但是它仍然失败了。见下文。
relatedSentences: {
type: [String],
label: "Related Sentence",
optional: false,
blackbox: true,
defaultValue: []
},
现在我在控制台中获得以下结果。这些值现在作为带引号的数组返回,这正是我所期望的。但$ in仍未将其视为一个数组。
["Ls6EyBkbcotcyfLyw", "6HKQroCjZhG9YCuBt"]
selector.js:595 Uncaught Error: $in needs an array
如何填充数据
回答@Kyll - 这是最初填充数据的方式。我正在使用AutoForm,
{{> afQuickField name='relatedSentences.0' value=this._id type="hidden"}}
然后通过钩子添加数组数据。
AutoForm.addHooks('translateForm', {
onSuccess: function (operation, result, template) {
Meteor.subscribe('sentences', function() {
var translatedSentence = Sentences.findOne(result);
var originalSentenceId = translatedSentence.relatedSentences[0]
Sentences.update(
{ _id: originalSentenceId},
{ $push: { relatedSentences: result}
});
Router.go('showSentence',{ _id: originalSentenceId } );
});
}
});
答案 0 :(得分:1)
这里的问题是this
的范围。您在subscribe函数中引用它,其中this
具有不同的上下文。在其工作的上下文中将varibale设置为this
,然后使用该变量:
Template.showSentence.helpers({
translations: function() {
console.log("related: " + this.relatedSentences);
var this_related_sentences = this.relatedSentences;
Meteor.subscribe('sentences', function() {
var relatedSentences = Sentences.find({_id: {$in: this_related_sentences} }).fetch();
console.log("rel count" + relatedSentences.length);
return relatedSentences;
});
}
});