我花了两天时间查看可能的答案,并尝试了所有可能的工作。如果我忽视某些事情,请原谅我。这是场景。
假设我导航到某个网址,例如/#/register/:session
,此路由触发了我希望用户填写的字段的JSON请求,以便注册此会话。像这样:
fieldsMapping = { "include": ["fields"] }
ko.mapping.fromJS(data, fieldsMapping, self.attendee.registration.registrationFields);
响应只是一个JSON对象,我映射到名为registrationFields()的视图模型。 JSON看起来像这样:
"fields": [
{ "field": "firstName", "required": true, "maxSize": 128 },
{ "field": "lastName", "required": true, "maxSize": 128 },
{ "field": "email", "required": true, "maxSize": 128 }
]
下一步是为响应中的任何字段生成HTML。
<div class="registration-fields" data-bind="foreach: webapp.attendee.registration.registrationFields.fields(), registrationFieldsLayout: true">
<label data-bind="text: message('registration.registrant.field.' + field()), attr: { for: '#' + field() }"></label>
<!-- ko if: field() === "firstName" || field() === "lastName" -->
<input type="text" data-bind="attr: { id: '#' + field(), value: $parent.firstName, 'data-validate': (required()) ? true : false }">
<!-- /ko -->
<!-- ko if: field() === "email" -->
<input type="email" data-bind="attr: { id: '#' + field(), value: $parent.email, 'data-validate': (required()) ? true : false }">
<!-- /ko -->
</div>
对于$parent
变量,我附加了另一个视图模型来保存名为RegistrationForm()的表单数据。我在表单标签中执行此操作:
<form method="post" data-bind="with: webapp.attendee.registration.registrationForm">
registrationForm()视图模型如下所示:
function (ko, validationRules) {
return function RegistrationForm () {
var self = this;
validationRules();
self.firstName = ko.observable().extend({ required: true });
self.lastName = ko.observable().extend({ required: true });
self.email = ko.observable().extend({ required: true, email: true });
self.submit = function () {
if (self.errors().length === 0) {
console.log("hurrah");
} else {
console.log("errors should be shown");
self.errors.showAllMessages();
}
}
self.errors = ko.validation.group(self);
}
}
现在,我的所有视图模型都加载了requirejs,这很棒。但是,我的字段在渲染后没有附加到RegistrationForm()视图模型,因此验证不起作用。
如果我放入静态字段,验证工作正常。
我尝试了很多不同的东西,但似乎没有任何效果。希望有人可以提供一些帮助。
感谢。
答案 0 :(得分:1)
确定。没关系。问题出在这里:
<input type="text" data-bind="attr: { id: '#' + field(), value: $parent.firstName, 'data-validate': (required()) ? true : false }">
应该是:
<input type="text" data-bind="attr: { id: '#' + field(), 'data-validate': (required()) ? true : false }, value: $parent.firstName">
无法相信我错过了。