【问题标题】:Button not enabling when form fields are filled填写表单字段时按钮未启用
【发布时间】: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


【解决方案1】:

请尝试使用以下代码 sn-p。通过使用文件名和文件引用,您可以轻松了解如何为淘汰 MVVM 创建文件夹/文件结构。

test.html

<!DOCTYPE html>
<html>
<head>
    <title>Test</title>
    <script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
    <script src="Scripts/knockout-3.1.0.js" type="text/javascript"></script>
    <script src="ViewModels/testViewModel.js" type="text/javascript"></script>
</head>
<body>
    <div>
        <input type="text" data-bind="value: EmpNo" />
        <input type="text" data-bind="value: EmpName" />
        <button data-bind="enable: EmpNo() != '' && EmpName() != '' ">
            Submit</button>
    </div>
    <script type="text/javascript">
        ko.applyBindings(new testViewModel());
    </script>
</body>
</html>

testViewModel.js

var testViewModel = function () {
    this.EmpNo = ko.observable("");
    this.EmpName = ko.observable("");
};

如果有任何问题,请告诉我。如果可能,则临时创建新文件并检查它。所以可能会知道它实际上是如何工作的。

Demo1

Demo2

【讨论】:

  • 感谢您回答 +1。但我不知道将代码放在哪里。我有一个非常大的 js 文件。你有 gmail 以便我们可以在那里交谈
  • 请查看演示。要实现 MVVM,请按照以下步骤操作。 1.请添加加载Jquery.js文件。 2. 请加载 Knockout.js 文件。 3. 请编写 ViewModel 代码。 4. 接下来是元素/输入/按钮。 5. 'ko.applyBindings' 代码出现之后。
【解决方案2】:

问题是下面的代码 sn-p 只有在你的 asyncCommand 执行时才会执行。因此,您最终会得到一个与您的问题无关的表单。为了使其正常工作,请确保将执行处理程序之外的绑定设置 (ko.applyBindings) 移动到加载页面时执行的位置。

 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);

【讨论】:

  • 感谢您的回答,但我已经尝试过这种方式。它给了我一些不同的错误
  • @JqueryLearner 再次。将您的问题重构为 JSFiddle,人们将能够提供帮助。
  • 这是我的小提琴jsfiddle.net/javalover_stackoverflow/rKm9N/2 但有很多代码。我也通过查看其他答案创建了这个小提琴。但我不知道为什么它不起作用
  • @JqueryLearner 该代码有很多错误,我不知道从哪里开始。您正在引用 ko.asyncCommand 而不定义它。与 ko.DirtyFlag 相同。你真的应该从更简单的东西开始,直到你掌握了淘汰赛的基础知识,而不是到处乱找代码 sn-ps。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-02
  • 2017-10-25
  • 1970-01-01
  • 1970-01-01
  • 2018-08-04
相关资源
最近更新 更多