2

我无法使用 autoForm 将新的嵌套/数组值添加到集合中。

我正在尝试使用 quickForm 来更新问题。我希望用户能够添加更多答案选项。我的架构看起来像这样(简化为省略顺序、一些元数据等):

questionSchema = new SimpleSchema({
  label: {
    type:   String
  },
  answers: {
    type: Array,
    minCount: 2,
    maxCount: 6
  },
  "answers.$": {
    type: Object
  },
  "answers.$._id": {
    type: String,
    regEx: SimpleSchema.RegEx.Id,
    autoValue: function(){ return Random.id(); },
    autoform: {
      type: "hidden"
    }
  },
  "answers.$.label": {
    type: String,
    regEx: /.{1,150}/,
    autoform: {
      label: false
    }
  },
  "answers.$.count": {
    type: Number,
    defaultValue: 0,
    autoform: {
      type: "hidden"
    }
  }
});

除此之外,当我只是通过 quickForm 添加问题时answers.$.label,我没有使用任何选项。当我想编辑问题时,我添加了这些选项,因为否则我会收到投诉说我将其保留为空。所以我把它们隐藏起来,但让它们在形式中。autoformtype='insert'count

我的编辑表单如下所示:

{{> quickForm collection="Questions" id="editQuestionForm"
    type="update" setArrayItems="true" doc=questionToEdit
    fields="label, answers"}}

我目前能够更新我的问题的标签以及我最初添加的任何答案。但我无法添加新的答案选项。当我这样做时,它被拒绝,因为count它不是可选的。但我指定了一个defaultValue...

我宁愿我的 quickForm 看起来像这样,这样我就不会将counts 或_ids 放在用户可以更改它们的地方:

{{> quickForm collection="Questions" id="editQuestionForm"
    type="update" setArrayItems="true" doc=questionToEdit
    fields="label, answers, answers.$.label"}}

但也许我需要保留answers.$._id在那里并隐藏以确保我的更改更新正确的答案?

所以:

  1. 我的答案计数在插入时默认为 0,那么为什么在我编辑和添加答案时不会发生这种情况?

  2. autoForm 可以进行更新而不是更新吗?插入新问题、更新现有问题标签、使用defaultalueautoValue根据需要。

  3. 我应该对这种事情使用一种方法吗?

4

1 回答 1

2

编辑:我已经更新了示例并将测试应用程序部署到http://test-questions.meteor.com/上的 metoer 。它的边缘有点粗糙(老实说,它没什么用),但它应该显示出实际的功能。使用底部的添加新问题链接。现有问题应显示在添加问题表格的底部。单击现有问题进行编辑。总的来说,功能在那里。只是不要因为糟糕的设计而讨厌我。责怪时间女神。


我通常做嵌入式文档的方式是将每个子对象分成一个单独的模式。这使代码保持整洁,更容易理解,并避免典型的陷阱。

这里是一个示例项目,演示了以下 shema 的实际应用。只需 git pull 和流星运行:https ://github.com/nanlab/question


新链接http://app-bj9coxfk.meteorpad.com/

代码: http: //meteorpad.com/pad/7fAH5RCrSdwTiugmc/


问题.js:

Questions = new Mongo.Collection("questions");

SimpleSchema.answerSchema = new SimpleSchema({
    _id: {
        type: String,
        regEx: SimpleSchema.RegEx.Id,
        autoValue: function() {
            return Random.id();
        },
        autoform: {
            type: "hidden"
        }
    },
    label: {
        type: String,
        regEx: /.{1,150}/,
        autoform: {
            label: false
        }
    },
    count: {
        type: Number,
        autoValue: function() {
            return 0;
        },
    }
})

Questions.attachSchema(new SimpleSchema({
    label: {
        type: String
    },
    answers: {
        type: [SimpleSchema.answerSchema],
        minCount: 2,
        maxCount: 6
    },
}))


Questions.allow({
  insert: function(){return true;},
  update: function(){return true;},
})


if(Meteor.isServer) {
    Meteor.publish("questions", function() {
        return Questions.find();
    })
} else {
    Meteor.subscribe("questions");
}
于 2015-04-16T04:07:08.637 回答