【发布时间】:2014-04-17 16:32:31
【问题描述】:
我有一个表单和一个提交按钮。当所有字段都填满时,只有提交按钮将被启用,否则它将处于禁用状态。我指的是这个 question 但是当我在我的实现这个想法时项目然后它不工作。即使所有字段都已填充,该按钮始终处于禁用状态。我不知道错误发生在哪里。请帮助。
这是我的淘汰码。
self.newPatient = ko.asyncCommand({
execute: function(complete) {
var vm = {
name: ko.observable(""),
password: ko.observable(""),
address: ko.observable(""),
username: ko.observable("")
};
vm.isFormValid = ko.computed(function() {
return this.name() && this.password() && this.address() && this.username();
}, vm);
ko.applyBindings(vm);
var isValid=$('#addPatientForm').parsley( 'validate' );
if(isValid){
var patientJson=ko.toJSON(self.patient());
formdata.append("json",patientJson);
//self.enableButton(false);
var imagepath= $.ajax({
url: projectUrl+"newPatient",
type: "POST",
data: formdata,
processData: false,
contentType: false,
success: function (res) {
formdata = new FormData();
imagepath=res;
var length=self.patients().length;
var patient=self.patient();
// self.enableButton(true);
}
});
$('.alert-patient-success').show();
self.patients.removeAll();
self.getPatients();
/* $.when(self.patients.push(self.patient()),self.patient(new Patient()),self.dirtyFlag1().reset(),$('#patientTabs a:last').tab('show'))
.always(complete);*/
}
},
canExecute: function(isExecuting) {
return !isExecuting && isDirty() && isValid();
}
});
这是保存按钮代码。
<button class="btn btn-primary"data-bind="command: $root.newPatient, activity: $root.newPatient.isExecuting,enable: $root.newPatient.isFormValid" >
<i class="icon-ok icon-white"></i> Save
</button>
这是表格
<form id="addPatientForm" data-validate="parsley">
<div class="control-group">
<label class="control-label" for="inputIcon">Name :</label>
<div class="controls">
<div class="input-prepend" >
<span class="add-on"><i class="icon-hand-right"></i></span>
<input class="span8" type="text" data-bind="value: name,valueUpdate: 'keyup'" data-required="true" data-trigger="change" name="name">
</div>
</div>
</div>
<div class="control-group">
<label class="control-label" for="inputIcon">Address :</label>
<div class="controls">
<div class="input-prepend">
<span class="add-on"><i class="icon-hand-right"></i></span>
<input class="span8" name="address" type="text" data-bind="value: address,valueUpdate: 'keyup'" data-required="true" data-trigger="change">
</div>
</div>
</div>
<div class="control-group">
<label class="control-label" for="inputIcon">Gender :</label>
<div class="controls">
<div class="input-prepend">
<span class="add-on"><i class="icon-hand-right"></i></span>
<select class="span8" name="gender" data-bind="options: $root.genderOptions,value: gender,optionsCaption: 'Select Gender'" data-required="true" data-trigger="change">
</select>
</div>
</div>
</div>
<div class="control-group">
<label class="control-label" for="inputIcon">Consultant :</label>
<div class="controls">
<div class="input-prepend">
<span class="add-on"><i class="cus-user_suit"></i></span>
<select class="span8" name="consultant" data-bind="options: $root.doctors,optionsText: function(item){return item.name},optionsValue:function(item){return item.username},selectedOptions: consultant,value:consultant" data-required="true" data-trigger="change">
</select>
</div>
</div>
</div>
<div class="control-group">
<label class="control-label" for="inputIcon">Username :</label>
<div class="controls">
<div class="input-prepend">
<span class="add-on"><i class="icon-hand-right"></i></span>
<input class="span8" type="text" data-bind="value: username" name="username,valueUpdate: 'keyup'" data-required="true" data-trigger="change" data-remote="${pageContext.request.contextPath}/isUserNameExists" data-remote-method="GET">
</div>
</div>
</div>
<div class="control-group">
<label class="control-label" for="inputIcon">Password :</label>
<div class="controls">
<div class="input-prepend">
<span class="add-on"><i class="icon-hand-right"></i></span>
<input class="span8" type="password" data-bind="value: password" name="password,valueUpdate: 'keyup'" data-required="true" data-trigger="change">
</div>
</div>
</div>
<div class="control-group">
<label class="control-label" for="inputIcon">Mobile :</label>
<div class="controls">
<div class="input-prepend">
<span class="add-on"><i class="cus-phone"></i></span>
<input class="span8" type="text" data-bind="value: mobile,valueUpdate: 'keyup'" data-type="number" data-minlength="10"data-required="true" data-trigger="change" data-type="phone" name="mobile">
</div>
</div>
</div>
<div class="control-group">
<label class="control-label" for="inputIcon">Email address :</label>
<div class="controls">
<div class="input-prepend">
<span class="add-on"><i class="icon-envelope"></i></span>
<input class="span8" type="text" data-bind="value: email,valueUpdate: 'keyup'" data-required="true" data-trigger="change" data-type="email" name="email">
</div>
</div>
</div>
</form>
【问题讨论】:
-
@downvoter 感谢您的投票。但也请发表评论。请告诉我如何改进它
-
我无法跟踪您的视图模型中发生的事情。您在
execute方法中创建一个新的虚拟机并调用ko.applyBindings重新绑定页面并破坏一切。你想在execute方法中实现什么?还请尝试将代码和示例减少到最低级别,其中仍然包含复杂性但具有足够的上下文,以便您的问题可以被重新记录(您还应该尝试从中创建一个小提琴)。 -
关于否决票:您发布了一堆代码,只有很少的上下文,没有实际问题,只是声明它不起作用,请有人为我修复它。
-
@PatrickSteele 如果现有问题不能解决我的问题,我们不能再问一个问题吗?
标签: javascript jquery knockout.js