在我的Meteor应用程序中,我将模式保存在名为ClassifiedsTemp的集合中,现在我正在尝试加载从DB检索的模式,以使用自动表单和简单模式包为它们生成表单。所以我使用下面显示的代码,但我总是收到以下错误:
Uncaught TypeError: existingKey.indexOf is not a function
任何想法我可能做错了/错过了吗?感谢
客户端js代码:
this.classTempArrayToJSON = function(classTempArray) {
var tempSchemaObj = {};
for(var i=0; i<classTempArray.length; i++){
if(classTempArray[i].fieldtype=='String'){
tempSchemaObj[classTempArray[i].fieldname] = { type: classTempArray[i].fieldtype,
label: classTempArray[i].fieldlbl,
min: Number(classTempArray[i].minval),
max: Number(classTempArray[i].maxval),
optional: !classTempArray[i].required };
}
}
return tempSchemaObj;
};
Template.SchemaGenTemp.events({
'click #createSchema': function(e, t){
var x = ClassifiedsTemp.find({}).fetch();
var schema = JSON.stringify(classTempArrayToJSON(x[1].fieldsList));
console.log(schema);
SampleClassColSchema = new SimpleSchema(schema); //Crash here...
console.log('Done');
}
});
JSON.stringify输出示例:
{"Test":{"type":"String","label":"Car Price","min":1,"max":1000000,"optional":true}}
答案 0 :(得分:2)
两个问题:
String
是一个实际类型,它不应该在引号之间。 知道这一点,试试这个代码:
this.classTempArrayToJSON = function(classTempArray) {
var tempSchemaObj = {};
for(var i=0; i<classTempArray.length; i++){
if(classTempArray[i].fieldtype=='String'){
tempSchemaObj[classTempArray[i].fieldname] = { type: String, // since it will always be 'String'
label: classTempArray[i].fieldlbl,
min: Number(classTempArray[i].minval),
max: Number(classTempArray[i].maxval),
optional: !classTempArray[i].required };
}
}
return tempSchemaObj;
};
Template.SchemaGenTemp.events({
'click #createSchema': function(e, t){
var x = ClassifiedsTemp.find({}).fetch();
var schema = classTempArrayToJSON(x[1].fieldsList);
console.log(schema);
SampleClassColSchema = new SimpleSchema(schema); // No crash here...
console.log('Done');
}
});
答案 1 :(得分:1)
实际上你必须将一个对象作为参数传递给SimpleSchema构造函数。
在这种情况下,您不需要在获取的对象上使用JSON.stringify
。
您也可以使用下划线_.each()
方法代替for()
循环。