Quickform / Autoform更新嵌套对象数组
Quickform / Autoform updating nested array of objects
我在使用 autoForm 向集合中添加新 nested/array 值时遇到问题。
我正在尝试使用快速表单来更新问题。我希望用户能够添加更多答案选项。我的架构如下所示(简化为省略顺序、一些元数据等):
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"
}
}
});
除了 answers.$.label
,当我只是通过快速表单 type='insert'
添加问题时,我没有使用任何 autoform
选项。当我想编辑问题时,我添加了这些选项,否则我会收到投诉,说我让 count
为空。所以我把它们隐藏起来,但让它们以形式出现。
我的编辑表单如下所示:
{{> quickForm collection="Questions" id="editQuestionForm"
type="update" setArrayItems="true" doc=questionToEdit
fields="label, answers"}}
我目前可以更新我的问题和我最初添加的任何答案的标签。但我无法添加新的答案选项。当我这样做时,它被拒绝了,因为 count
不是可选的。但是我指定了 defaultValue
...
我希望我的 quickForm 看起来像这样,这样我就不会把 count
s 或 _id
s 放在用户可以更改它们的地方:
{{> quickForm collection="Questions" id="editQuestionForm"
type="update" setArrayItems="true" doc=questionToEdit
fields="label, answers, answers.$.label"}}
但也许我需要将 answers.$._id
保留在那里并隐藏以确保我的更改更新正确的答案?
所以:
我的答案在插入时默认为 0,那么为什么在我编辑和添加答案时不会发生这种情况?
autoForm 可以执行更新插入而不是更新吗?插入新问题,更新现有问题标签,根据需要使用 defaultalue
或 autoValue
。
这种东西要用方法吗?
编辑:
我已经更新了示例并将测试应用程序部署到位于 http://test-questions.meteor.com/ 的 metoer。它的边缘有点粗糙(老实说,它一点用都没有),但它应该显示实际的功能。使用底部的添加新问题 link。现有问题应显示在 addquestion 表单的底部。单击现有问题进行编辑。总的来说,功能是有的。只是不要因为糟糕的设计而恨我。都怪时光女神。
我通常做嵌入式文档的方式是将每个子对象分成一个单独的模式。
这使代码保持整洁和易于理解,并避免典型的陷阱。
这里是一个示例项目,演示了以下 shema 的运行情况。只是 git 拉和流星 运行: https://github.com/nanlab/question
新 link http://app-bj9coxfk.meteorpad.com/
代码:http://meteorpad.com/pad/7fAH5RCrSdwTiugmc/
question.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");
}
我在使用 autoForm 向集合中添加新 nested/array 值时遇到问题。
我正在尝试使用快速表单来更新问题。我希望用户能够添加更多答案选项。我的架构如下所示(简化为省略顺序、一些元数据等):
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"
}
}
});
除了 answers.$.label
,当我只是通过快速表单 type='insert'
添加问题时,我没有使用任何 autoform
选项。当我想编辑问题时,我添加了这些选项,否则我会收到投诉,说我让 count
为空。所以我把它们隐藏起来,但让它们以形式出现。
我的编辑表单如下所示:
{{> quickForm collection="Questions" id="editQuestionForm"
type="update" setArrayItems="true" doc=questionToEdit
fields="label, answers"}}
我目前可以更新我的问题和我最初添加的任何答案的标签。但我无法添加新的答案选项。当我这样做时,它被拒绝了,因为 count
不是可选的。但是我指定了 defaultValue
...
我希望我的 quickForm 看起来像这样,这样我就不会把 count
s 或 _id
s 放在用户可以更改它们的地方:
{{> quickForm collection="Questions" id="editQuestionForm"
type="update" setArrayItems="true" doc=questionToEdit
fields="label, answers, answers.$.label"}}
但也许我需要将 answers.$._id
保留在那里并隐藏以确保我的更改更新正确的答案?
所以:
我的答案在插入时默认为 0,那么为什么在我编辑和添加答案时不会发生这种情况?
autoForm 可以执行更新插入而不是更新吗?插入新问题,更新现有问题标签,根据需要使用
defaultalue
或autoValue
。这种东西要用方法吗?
编辑: 我已经更新了示例并将测试应用程序部署到位于 http://test-questions.meteor.com/ 的 metoer。它的边缘有点粗糙(老实说,它一点用都没有),但它应该显示实际的功能。使用底部的添加新问题 link。现有问题应显示在 addquestion 表单的底部。单击现有问题进行编辑。总的来说,功能是有的。只是不要因为糟糕的设计而恨我。都怪时光女神。
我通常做嵌入式文档的方式是将每个子对象分成一个单独的模式。 这使代码保持整洁和易于理解,并避免典型的陷阱。
这里是一个示例项目,演示了以下 shema 的运行情况。只是 git 拉和流星 运行: https://github.com/nanlab/question
新 link http://app-bj9coxfk.meteorpad.com/
代码:http://meteorpad.com/pad/7fAH5RCrSdwTiugmc/
question.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");
}