lym*_*yma 4 knockout-2.0 knockout.js knockout-validation
在这里寻找理智的检查.我最近开始学习淘汰赛,并已被指示转换现有的多步骤表格.
基本思想是在允许用户继续之前验证每个步骤.还设置了某些限制(未显示),用于确定是继续向前还是使用所有当前数据提交(例如:如果他们不符合条件).
这是一个简化版本的小提琴(实际形式包含4个步骤约40个字段)
http://jsfiddle.net/dyngomite/BZcNg/
HTML:
<form id="register">
<fieldset>
<h2>About You</h2>
<ul>
<li>
<label for="firstName">First Name:</label>
<input type="text" data-bind="value: firstName" required="required" />
</li>
<li>
<label for="lastName">Last Name</label>
<input type="text" data-bind="value: lastName" required="required" />
</li>
</ul>
</fieldset>
<fieldset>
<h2>Your Business</h2>
<ul>
<li>
<label for="businessName">Business Name:</label>
<input type="text" data-bind="value: businessName" required="required" />
</li>
<li>
<label for="currentCustomer">Were you referred by someone?</label>
<input type="checkbox" data-bind="checked: referred" />
</li>
</ul>
</fieldset>
<fieldset>
<h2>User Info</h2>
<ul>
<li>
<label for="userName">Referrer's First Name:</label>
<input type="text" data-bind="value: referralFirst" required="required" />
</li>
<li>
<label for="password">Referrer's Last Name:</label>
<input type="password" data-bind="value: referralLast" required="required" />
</li>
</ul>
</fieldset>
</form>
<div class="nav-buttons"> <a href="#" data-bind='click: stepForward'>Continue</a>
<a href="#" data-bind='click: stepBack'>Back</a>
<a href="#" data-bind='click: resetAll'>Cancel</a>
</div>
Run Code Online (Sandbox Code Playgroud)
JS:
$("#register").children().hide().first().show();
ko.validation.init({
parseInputAttributes: true,
decorateElement: true,
writeInputAttributes: true,
errorElementClass: "error"
});
function myViewModel() {
var self = this;
//observable init
self.firstName = ko.observable();
self.lastName = ko.observable();
self.businessName = ko.observable();
self.referred = ko.observable();
self.referralFirst = ko.observable();
self.referralLast = ko.observable();
//validaiton observable init
self.step1 = ko.validatedObservable({
firstName: self.firstName,
lastName: self.lastName
});
self.step2 = ko.validatedObservable({
businessName: self.businessName,
referred: self.referred
});
self.step3 = ko.validatedObservable({
referralFirst: self.referralFirst,
referralLast: self.referralLast
});
//navigation init
self.currentStep = ko.observable(1);
self.stepForward = function () {
if(self.currentStep()<4){
self.changeSection(self.currentStep() + 1);
}
}
self.stepBack = function () {
if (self.currentStep() > 1) {
self.changeSection(self.currentStep() - 1);
}
}
self.changeSection = function(destIdx){
var validationObservable = "step" + self.currentStep();
if(self[validationObservable]().isValid()){
self.currentStep(destIdx);
$("#register").children().hide().eq(self.currentStep() - 1).show();
return true;
}else{
self[validationObservable]().errors.showAllMessages();
}
return false;
}
self.resetAll = function(){
//TODO
return false;
}
}
ko.applyBindings(new myViewModel());
Run Code Online (Sandbox Code Playgroud)
我的问题:
将所有字段最初声明为可观察对象然后将它们聚合到validatedObservables()中是否有意义?
如果最后我想提交整个表单,是否有更聪明的方法来实现这一点,而不是使用ko.toJSON(self.step1())连接每个步骤.我是否需要创建一个包含所有输入可观察量的"完整形式"observable?换句话说,序列化完整表单的最佳方法是什么?我想使用ko.toJSON(自我)吗?
将表单重置为初始配置的最佳方法是什么?有没有办法重新应用ko.applyBindings(new myViewModel())?
我正确地谈到这个吗?
谢谢你的任何澄清.
这是一个好的开始.我建议您使用knockout管理可见性,只有在没有其他选项时才转向jQuery.我的意思是管理字段集的可见性:
<fieldset data-bind="visible: currentStep() === 1">
Run Code Online (Sandbox Code Playgroud)
是的,最初将所有字段都作为可观察对象是有意义的.好的策略是从服务器获取数据作为JSON,并使用映射插件将所有内容转换为可观察对象.如果您更喜欢手动编码,那没关系.
最后只需提交整个视图模型:ko.toJSON(self)将把它序列化为JSON.您可能希望将其转换为JS对象:ko.toJS,然后清除您不想提交的数据(例如查找数据等),然后使用JSON.stringify转换为JSON.
使用验证插件很难重置验证状态.要重置表单,只需从DOM中删除现有表单,并在新HTML上删除applyBindings.将HTML放在页面上方便的地方:
要重置表单,请执行:
<script type="text/html" id="ko-template">
<form id="register">
...
</form>
</script>
<div id="context"></div>
Run Code Online (Sandbox Code Playgroud)
JavaScript的:
var template = $('#ko-template').html();
$('#context').empty().html(template);
ko.applyBindings(new myViewModel(), document.getElementById('context'));
Run Code Online (Sandbox Code Playgroud)
在这种情况下,不需要表单标记,因为您使用JS对象管理所有内容.
| 归档时间: |
|
| 查看次数: |
5297 次 |
| 最近记录: |