如何动态更改 Autoform / SimpleSchema 中字段可选属性的值?
How to dynamically change the value of an optional attribute of a field in Autoform / SimpleSchema?
我有一个包含两个字段的 SimpleSchema 实例:
isApproved: {
type: Boolean,
defaultValue: false
},
impactedSystems: {
type: String,
optional: true
}
如果设置了 isApproved,我想将 impactedSystems 的 optional
属性更改为 false
至 true
.
我已尝试按照 docs 中的说明进行操作,但无法正常工作。它建议我像这样向 impactedSystems 添加一个自定义函数(用我的字段名称修改):
custom: function () {
var shouldBeRequired = this.field('isApproved').value == 1;
if (shouldBeRequired) {
// inserts
if (!this.operator) {
if (!this.isSet || this.value === null || this.value === "") return "required";
}
// updates
else if (this.isSet) {
if (this.operator === "$set" && this.value === null || this.value === "") return "required";
if (this.operator === "$unset") return "required";
if (this.operator === "$rename") return "required";
}
}
}
无论 isApproved 是否为真,该字段都是可选的。
我也尝试了 this 答案中的代码,但是 optional
的值在更新它所依赖的字段 (isApproved
) 时不会改变。
如何让 optional
的值成为另一个布尔类型字段的相反值?!
试试这个代码。不可否认,它有点令人费解......
这是一个通用的助手,您可以在所有模式中使用它:
// This helper method does the ceremony around SimpleSchema's requirements
export const isRequired = (thing,shouldBeRequired) => {
if (shouldBeRequired) {
// inserts
if (!thing.operator) {
if (!thing.isSet || thing.value === null || thing.value === "") return "required";
}
// updates
else if (thing.isSet) {
if (thing.operator === "$set" && thing.value === null || thing.value === "") return "required";
if (thing.operator === "$unset") return "required";
if (thing.operator === "$rename") return "required";
}
}
};
在架构本身中,您可以这样做:
const isRequiredWhenApproved = (record) => {
const shouldBeRequired = (record.field('isApproved').value);
return isRequired(record, shouldBeRequired);
};
isApproved: {
type: Boolean,
defaultValue: false
},
impactedSystems: {
type: String,
optional: true,
custom() {
return isRequiredWhenApproved(this);
},
},
希望对你有用
我终于明白了。我从一种形式插入 isApproved,然后在另一种形式中更新 impactedSystems。我所要做的就是在我希望读取其值的更新表单中包含 isApproved(带有 type=hidden
)。我提供的代码是正确的。
例子
{#autoForm collection=Requests doc=this id="singleRequestLayout" type="update"}} //This can also be of type insert
{{> afQuickField name="isApproved" type="hidden"}}
{{> afQuickField name="impactedSystems"}}
<button type="submit" class="button">Submit</button>
{{/autoForm}}
我有一个包含两个字段的 SimpleSchema 实例:
isApproved: {
type: Boolean,
defaultValue: false
},
impactedSystems: {
type: String,
optional: true
}
如果设置了 isApproved,我想将 impactedSystems 的 optional
属性更改为 false
至 true
.
我已尝试按照 docs 中的说明进行操作,但无法正常工作。它建议我像这样向 impactedSystems 添加一个自定义函数(用我的字段名称修改):
custom: function () {
var shouldBeRequired = this.field('isApproved').value == 1;
if (shouldBeRequired) {
// inserts
if (!this.operator) {
if (!this.isSet || this.value === null || this.value === "") return "required";
}
// updates
else if (this.isSet) {
if (this.operator === "$set" && this.value === null || this.value === "") return "required";
if (this.operator === "$unset") return "required";
if (this.operator === "$rename") return "required";
}
}
}
无论 isApproved 是否为真,该字段都是可选的。
我也尝试了 this 答案中的代码,但是 optional
的值在更新它所依赖的字段 (isApproved
) 时不会改变。
如何让 optional
的值成为另一个布尔类型字段的相反值?!
试试这个代码。不可否认,它有点令人费解......
这是一个通用的助手,您可以在所有模式中使用它:
// This helper method does the ceremony around SimpleSchema's requirements
export const isRequired = (thing,shouldBeRequired) => {
if (shouldBeRequired) {
// inserts
if (!thing.operator) {
if (!thing.isSet || thing.value === null || thing.value === "") return "required";
}
// updates
else if (thing.isSet) {
if (thing.operator === "$set" && thing.value === null || thing.value === "") return "required";
if (thing.operator === "$unset") return "required";
if (thing.operator === "$rename") return "required";
}
}
};
在架构本身中,您可以这样做:
const isRequiredWhenApproved = (record) => {
const shouldBeRequired = (record.field('isApproved').value);
return isRequired(record, shouldBeRequired);
};
isApproved: {
type: Boolean,
defaultValue: false
},
impactedSystems: {
type: String,
optional: true,
custom() {
return isRequiredWhenApproved(this);
},
},
希望对你有用
我终于明白了。我从一种形式插入 isApproved,然后在另一种形式中更新 impactedSystems。我所要做的就是在我希望读取其值的更新表单中包含 isApproved(带有 type=hidden
)。我提供的代码是正确的。
例子
{#autoForm collection=Requests doc=this id="singleRequestLayout" type="update"}} //This can also be of type insert
{{> afQuickField name="isApproved" type="hidden"}}
{{> afQuickField name="impactedSystems"}}
<button type="submit" class="button">Submit</button>
{{/autoForm}}