3

基本上,我在登录表单上有一个登录按钮,可以很好地与 jQuery 1.8.3(我已经尝试过 1.9.0)和 Knockout 2.2.1 observables 以及启用/禁用登录按钮的绑定。

当计算函数发现缺少用户名或密码时,启用按钮被禁用。

但是,当 Google Chrome (24.0.1312.56 m) 在页面加载后片刻自动填充文本框时,就会出现问题。当 Chrome 更新文本框时,viewmodel 和计算的 observable 不会检测到,因此按钮保持禁用状态。

我做了一个基本的jsfiddle。我不知道如何让 jsfiddle 自动填充来显示这个问题 :) 你只需要相信我。

Javascript/视图模型

$(document).ready(function(e) {
    var loginViewModel = function() {

        var self=this;
        self.loginName = ko.observable("");
        self.loginPass = ko.observable("");

        self.loginInfoValid = ko.computed(function() {

            if (self.loginName().length > 0 && self.loginPass().length > 0) {
                return true;
            } else {
                return false;
            }

        });

    };

    ko.applyBindings(new loginViewModel());     
});

HTML

<input type="text" data-bind="value: loginName, valueUpdate:'afterkeydown'"><br>
<input type="text" data-bind="value: loginPass, valueUpdate:'afterkeydown'"><br>
<span data-bind="text: loginName"></span><br>
<button data-bind="enable: loginInfoValid">Login</button>

jsfiddle:http: //jsfiddle.net/vW6Xy/1/

谢谢!!

4

2 回答 2

1

你可以

  • change事件处理程序绑定到文本对象并手动调用该self.loginInfoValid方法,或者
  • 用于setTimeout等待一小段时间并手动调用该self.loginInfoValid方法。

如果change在 Chrom 自动填充时引发事件,那将是我首选的两者解决方案。

于 2013-01-25T20:46:54.420 回答
1

找到了一种很好的不引人注目的方式,例如:

var emailInput = $('#email');
var passwordInput = $('#password');

emailInput.on('blur', function () { passwordInput.trigger('change'); });

因此,当您失去对电子邮件/用户输入的关注时,它将触发密码输入上的更改事件,从而导致视图模型上的密码属性被更新。

于 2014-01-14T11:50:52.693 回答