【问题标题】:How to get jquery validation status with knockout custom binding?如何使用淘汰赛自定义绑定获取 jquery 验证状态?
【发布时间】:2013-11-05 12:12:45
【问题描述】:

我尝试创建没有视图信息的视图模型,例如在保存/发送数据到服务器之前直接从视图模型调用 jquery 验证。

var vm = function () {
    var self = this;

    self.password = ko.observable();
    self.save = function (form) {
       // I want to prevent any view information call directly from view model.
       if ($(form).isValid()) {
          // $.ajax({});
       }
    };
};
ko.applyBindings(new vm());

@using (Html.BeginForm(null, null, FormMethod.Post, new { data_bind = "submit: save" }))

我也不想在视图模型中手动重新创建敲除验证,因为它们已由 asp.mvc 数据注释生成为 jquery 验证属性。

[Required]
[StringLength(100, ErrorMessageResourceName = "ErrorMinStringLength", ErrorMessageResourceType = typeof(Locale), MinimumLength = 6)]
[DataType(DataType.Password)]
public string Password { get; set; }

@Html.PasswordFor(m => m.Password, new { data_bind = "value: Password" })

// Generated html in the browser view source.
<input type="password" name="Password" id="Password" data-val-required="The Password field is required." data-val-length-min="6" data-val-length-max="100" data-val-length="The Password must be at least 6 characters long." data-val="true" data-bind="value: Password">

我创建了一个简单的自定义绑定,它将更新有效状态如下。

ko.bindingHandlers.jQueryIsValid = {
    init: function (element, valueAccessor) {
        $(element).closest("form").change(function () {
            var observable = valueAccessor();
            var isValid = $(element).valid();
            observable(isValid);
        });
    }
};

然后更新html和视图模型如下。

@using (Html.BeginForm(null, null, FormMethod.Post, new { data_bind = "submit: save, jQueryIsValid: isValid" }))

var vm = function () {
    var self = this;

    self.password = ko.observable();
    self.isValid = ko.observable();
    self.save = function () {
       if (self.isValid()) {
          // $.ajax({});
       }
    };
};
ko.applyBindings(new vm());

我的观点是强制执行 mvvm 模式,因为 viewmodel 理想情况下应该不了解视图(如 $(form).dosomething)。我只是不确定上述解决方案是最好的方法。由于我是淘汰赛新手,因此我可能会错过一些关于自定义绑定或现有淘汰赛功能的信息。

任何人都可以展示正确/最佳的方法吗?

【问题讨论】:

    标签: asp.net-mvc mvvm knockout.js jquery-validate


    【解决方案1】:

    自定义绑定是不必要的。视图模型不需要知道表单的有效性。重点是 save 只能在有效表单上调用。此外,由于您打算用 AJAX 调用替换提交行为,因此您需要确保在单击提交按钮时表单回发。

    您可以通过以下方式实现...

    $('form').submit(function(e){
        if ($(this).valid()) {
            viewModel.save();
            e.preventDefault();
        }
    });
    

    【讨论】:

    • 可能和我原来的代码一样,我用的是knockout data_bind = "submit: save"的submit事件绑定,你用jquery的submit事件。
    • 处理submit 的任何一种方法都同样有效。我要说的一点是,在您的save 函数范围之外检查有效性,并且您必须 调用e.preventDefault(),否则浏览器会发布表单并且您不会观察到您的异步行为。
    • 我正在使用淘汰赛在 js 上实现 mvvm 模式,并基于knockoutjs.com/documentation/…,“使用 KO 时,您的视图模型是纯 JavaScript 对象,不具备 HTML 知识”,并且我的原始代码的问题是我必须在保存之前验证这个“if ($(form).isValid())”代码。然后我尝试创建自己的绑定处理程序,但我不确定 KO 中是否已经有这样的功能,而且每次表单更改时都会触发表单验证。我期待像 ko.IsValid() 这样的东西,如果有的话。
    • 不,没有这样的东西。我在这里给出的示例严格执行 MVVM。提交处理程序包含&lt;form&gt; 的知识,允许我们测试$(this).valid() 并调用e.preventDefault()。这意味着您的视图模型不需要 DOM 知识。
    猜你喜欢
    • 2016-08-13
    • 1970-01-01
    • 2013-07-01
    • 2015-06-25
    • 1970-01-01
    • 2013-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多