使用aldeed Simple Schema包的Meteor动态模式

时间:2015-04-19 11:32:13

标签: meteor

在我的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}}

2 个答案:

答案 0 :(得分:2)

两个问题:

  1. 正如Aleksei指出的那样,你不应该将你的fieldsList字符串化。
  2. String是一个实际类型,它不应该在引号之间。
  3. 知道这一点,试试这个代码:

            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()循环。