如何使用击倒一次又一次地调用函数

时间:2014-04-18 04:55:09

标签: javascript jquery knockout.js

我有这个淘汰代码。

self.newPatient = ko.asyncCommand({

     execute: function(complete) {
        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);
                }
     });    


     } 
     },
     canExecute: function(isExecuting) {
         return !isExecuting && isDirty() && isValid();
     }
 });

这是我的html输入字段

<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" 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" data-required="true" data-trigger="change">
                </div>
            </div>
        </div>

这是我的按钮

<button class="btn btn-primary"
                                                    data-bind="command: $root.newPatient, activity: $root.newPatient.isExecuting">
                                                    <i class="icon-ok icon-white"></i> Save
                                                </button>

当我按下保存按钮然后执行:function(complete){.....}被调用并在此函数内

var isValid=$('#addPatientForm').parsley( 'validate' );
调用

来检查表单有效性,如果表单无效,则isValid为false,因此不会调用ajax。

我想打电话

 var isValid=$('#addPatientForm').parsley( 'validate' );
        if(isValid){.....} 

当任何输入字段被更改时。任何人都可以建议我怎么做?

2 个答案:

答案 0 :(得分:1)

您可以使用observable的subscribe函数来运行代码:

username.subscribe(function () { isValid=$('#addPatientForm').parsley( 'validate' ); }
password.subscribe(function () { isValid=$('#addPatientForm').parsley( 'validate' ); }

评论后更新: 这就是我要做的事情:

<div id='koRoot'>
    <input type='text' data-bind='value: username' />
    <input type='text' data-bind='enable: enableButton,value: password' />
    <input type='button' data-bind='command: newPatient' value='Go!' />
</div>
...

和js:

    var callNewPatient = function () {
        if (self.awaitingValidation()) self.newPatient.execute();
    }

    this.username.subscribe(callNewPatient);
    this.password.subscribe(callNewPatient);

    this.newPatient = ko.asyncCommand({
        execute: function (complete) {
            self.isValid(self.username() === 'me' && self.password() === 'pass');
            if (self.isValid()) {
                self.awaitingValidation(false);
                alert("Valid!");
            } else {
                self.awaitingValidation(true);
            }
        },
        canExecute: function (isExecuting) {
            return self.isValid();
        }
    });

http://jsfiddle.net/nyothecat/LkaEJ/1/

答案 1 :(得分:1)

您可以编写自己的bindingHandler:

ko.bindingHandlers.parsley = {
    init: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
        var isValid = valueAccessor();
        var $form = $(element).closest('form');
        $(element).change(function() {
            isValid($form.parsley('validate'));
        });
    }
};

在你的ViewModel中:

self.isValid = ko.observable(false);

然后:

<form ...>
    <input data-bind="parsley: isValid, ..." />
</form>

请参阅http://jsfiddle.net/sjroesink/ksqXx/

修改

如果无法重现您的错误或错误发生的实际行,我无法帮助您。 尝试使用Chrome的开发人员工具查看错误发生的位置:

track error