Jquery 基于动态字段可见性更改剔除值绑定

Jquery 基于动态字段可见性更改剔除值绑定,jquery,knockout.js,Jquery,Knockout.js,我在这里举了一个简单的例子: 以下是我想要实现的目标。使用KnockoutJS,我使用文本绑定将一个标记绑定到一个计算的可观察对象: Full name: <span data-bind="text: fullName"></span> 全名: 加载表单时,值来自一组字段: First Name: <input type="text" data-bind="value: firstName" /><br /> MI Name: <inpu

我在这里举了一个简单的例子:

以下是我想要实现的目标。使用KnockoutJS,我使用文本绑定将一个标记绑定到一个计算的可观察对象:

Full name: <span data-bind="text: fullName"></span>
全名:
加载表单时,值来自一组字段:

First Name: <input type="text" data-bind="value: firstName" /><br />
MI Name: <input type="text" data-bind="value: middleInitial" /><br />
Last Name: <input type="text" data-bind="value: lastName" /> 
名字:
MI名称:
姓氏:
但是,我有另一组隐藏的字段,它们具有相同的绑定定义,并且我通过复选框控制它们的可见性。当这些字段可见时,我想让这些字段控制计算的可观察文本,并从初始字段集中删除数据绑定


我完全不知道该怎么做。我认为从第一组字段中删除数据绑定属性可能会起作用,但事实并非如此。可能有一种更简单的方法来实现这一点,我愿意听取建议。

您可以根据您的复选框清理div元素的绑定ko.cleanNode方法将从DOM元素中删除绑定,并且您可以在干净的DOM节点上再次应用绑定

function EmployeeViewModel(firstName, lastName, middleInitial){
    var self = this;
    self.firstName = ko.observable(firstName);
    self.lastName = ko.observable(lastName);
    self.middleInitial = ko.observable(middleInitial);

    self.fullName = ko.computed(function () {
        return self.lastName() + ", " + self.firstName() + " " + self.middleInitial();
    }, self);
}

var viewModel = new EmployeeViewModel("John", "Doe", "Q");
ko.applyBindings(viewModel);

$( document ).ready(function() {
     $("#chkNameChange").live("click", function (event) {                
         if ($("#chkNameChange").is(':checked')) {
             $("#headerSectionOne").text("Former Name");
             $("#sectionTwo").show();
             ko.cleanNode($("#sectionOne")[0]);
             if (ko.dataFor($("#sectionTwo")[0])) {
                  ko.applyBindings(viewModel,$("#sectionTwo")[0]);
             }
         }
         else{
            $("#headerSectionOne").text("Name");
             $("#sectionTwo").hide();

             ko.cleanNode($("#sectionTwo")[0]);
             if (ko.dataFor($("#sectionOne")[0])) {
                  ko.applyBindings(viewModel,$("#sectionOne")[0]);
             }
         }
     });
});

根据您的复选框,您可以清除div元素的绑定ko.cleanNode方法将从DOM元素中删除绑定,并且您可以在干净的DOM节点上再次应用绑定

function EmployeeViewModel(firstName, lastName, middleInitial){
    var self = this;
    self.firstName = ko.observable(firstName);
    self.lastName = ko.observable(lastName);
    self.middleInitial = ko.observable(middleInitial);

    self.fullName = ko.computed(function () {
        return self.lastName() + ", " + self.firstName() + " " + self.middleInitial();
    }, self);
}

var viewModel = new EmployeeViewModel("John", "Doe", "Q");
ko.applyBindings(viewModel);

$( document ).ready(function() {
     $("#chkNameChange").live("click", function (event) {                
         if ($("#chkNameChange").is(':checked')) {
             $("#headerSectionOne").text("Former Name");
             $("#sectionTwo").show();
             ko.cleanNode($("#sectionOne")[0]);
             if (ko.dataFor($("#sectionTwo")[0])) {
                  ko.applyBindings(viewModel,$("#sectionTwo")[0]);
             }
         }
         else{
            $("#headerSectionOne").text("Name");
             $("#sectionTwo").hide();

             ko.cleanNode($("#sectionTwo")[0]);
             if (ko.dataFor($("#sectionOne")[0])) {
                  ko.applyBindings(viewModel,$("#sectionOne")[0]);
             }
         }
     });
});

根据您的复选框,您可以清除div元素的绑定ko.cleanNode方法将从DOM元素中删除绑定,并且您可以在干净的DOM节点上再次应用绑定

function EmployeeViewModel(firstName, lastName, middleInitial){
    var self = this;
    self.firstName = ko.observable(firstName);
    self.lastName = ko.observable(lastName);
    self.middleInitial = ko.observable(middleInitial);

    self.fullName = ko.computed(function () {
        return self.lastName() + ", " + self.firstName() + " " + self.middleInitial();
    }, self);
}

var viewModel = new EmployeeViewModel("John", "Doe", "Q");
ko.applyBindings(viewModel);

$( document ).ready(function() {
     $("#chkNameChange").live("click", function (event) {                
         if ($("#chkNameChange").is(':checked')) {
             $("#headerSectionOne").text("Former Name");
             $("#sectionTwo").show();
             ko.cleanNode($("#sectionOne")[0]);
             if (ko.dataFor($("#sectionTwo")[0])) {
                  ko.applyBindings(viewModel,$("#sectionTwo")[0]);
             }
         }
         else{
            $("#headerSectionOne").text("Name");
             $("#sectionTwo").hide();

             ko.cleanNode($("#sectionTwo")[0]);
             if (ko.dataFor($("#sectionOne")[0])) {
                  ko.applyBindings(viewModel,$("#sectionOne")[0]);
             }
         }
     });
});

根据您的复选框,您可以清除div元素的绑定ko.cleanNode方法将从DOM元素中删除绑定,并且您可以在干净的DOM节点上再次应用绑定

function EmployeeViewModel(firstName, lastName, middleInitial){
    var self = this;
    self.firstName = ko.observable(firstName);
    self.lastName = ko.observable(lastName);
    self.middleInitial = ko.observable(middleInitial);

    self.fullName = ko.computed(function () {
        return self.lastName() + ", " + self.firstName() + " " + self.middleInitial();
    }, self);
}

var viewModel = new EmployeeViewModel("John", "Doe", "Q");
ko.applyBindings(viewModel);

$( document ).ready(function() {
     $("#chkNameChange").live("click", function (event) {                
         if ($("#chkNameChange").is(':checked')) {
             $("#headerSectionOne").text("Former Name");
             $("#sectionTwo").show();
             ko.cleanNode($("#sectionOne")[0]);
             if (ko.dataFor($("#sectionTwo")[0])) {
                  ko.applyBindings(viewModel,$("#sectionTwo")[0]);
             }
         }
         else{
            $("#headerSectionOne").text("Name");
             $("#sectionTwo").hide();

             ko.cleanNode($("#sectionTwo")[0]);
             if (ko.dataFor($("#sectionOne")[0])) {
                  ko.applyBindings(viewModel,$("#sectionOne")[0]);
             }
         }
     });
});

对于您试图做的事情,最简单的方法可能是添加一个可观察对象来跟踪您是否正在进行名称更改。您可以将其绑定到复选框,控制第二组字段的可见性,并在计算中使用它。代码可能如下所示:

function EmployeeViewModel(firstName, lastName, middleInitial){
    this.firstName = ko.observable(firstName);
    this.lastName = ko.observable(lastName);
    this.middleInitial = ko.observable(middleInitial);

    this.newFirstName = ko.observable(firstName);
    this.newLastName = ko.observable(lastName);
    this.newMiddleInitial = ko.observable(middleInitial);

    this.isNameChange = ko.observable(false);

    this.fullName = ko.computed(function () {
        if (this.isNameChange()) {
            return this.newLastName() + ", " + this.newFirstName() + " " + this.newMiddleInitial();    
        }

        return this.lastName() + ", " + this.firstName() + " " + this.middleInitial();
    }, this);
}
您可以对输入使用
checked
绑定,而不需要使用jQuery来处理更改


Fiddle:

对于您正在尝试做的事情,最简单的方法可能是添加一个可观察对象来跟踪您是否正在进行名称更改。您可以将其绑定到复选框,控制第二组字段的可见性,并在计算中使用它。代码可能如下所示:

function EmployeeViewModel(firstName, lastName, middleInitial){
    this.firstName = ko.observable(firstName);
    this.lastName = ko.observable(lastName);
    this.middleInitial = ko.observable(middleInitial);

    this.newFirstName = ko.observable(firstName);
    this.newLastName = ko.observable(lastName);
    this.newMiddleInitial = ko.observable(middleInitial);

    this.isNameChange = ko.observable(false);

    this.fullName = ko.computed(function () {
        if (this.isNameChange()) {
            return this.newLastName() + ", " + this.newFirstName() + " " + this.newMiddleInitial();    
        }

        return this.lastName() + ", " + this.firstName() + " " + this.middleInitial();
    }, this);
}
您可以对输入使用
checked
绑定,而不需要使用jQuery来处理更改


Fiddle:

对于您正在尝试做的事情,最简单的方法可能是添加一个可观察对象来跟踪您是否正在进行名称更改。您可以将其绑定到复选框,控制第二组字段的可见性,并在计算中使用它。代码可能如下所示:

function EmployeeViewModel(firstName, lastName, middleInitial){
    this.firstName = ko.observable(firstName);
    this.lastName = ko.observable(lastName);
    this.middleInitial = ko.observable(middleInitial);

    this.newFirstName = ko.observable(firstName);
    this.newLastName = ko.observable(lastName);
    this.newMiddleInitial = ko.observable(middleInitial);

    this.isNameChange = ko.observable(false);

    this.fullName = ko.computed(function () {
        if (this.isNameChange()) {
            return this.newLastName() + ", " + this.newFirstName() + " " + this.newMiddleInitial();    
        }

        return this.lastName() + ", " + this.firstName() + " " + this.middleInitial();
    }, this);
}
您可以对输入使用
checked
绑定,而不需要使用jQuery来处理更改


Fiddle:

对于您正在尝试做的事情,最简单的方法可能是添加一个可观察对象来跟踪您是否正在进行名称更改。您可以将其绑定到复选框,控制第二组字段的可见性,并在计算中使用它。代码可能如下所示:

function EmployeeViewModel(firstName, lastName, middleInitial){
    this.firstName = ko.observable(firstName);
    this.lastName = ko.observable(lastName);
    this.middleInitial = ko.observable(middleInitial);

    this.newFirstName = ko.observable(firstName);
    this.newLastName = ko.observable(lastName);
    this.newMiddleInitial = ko.observable(middleInitial);

    this.isNameChange = ko.observable(false);

    this.fullName = ko.computed(function () {
        if (this.isNameChange()) {
            return this.newLastName() + ", " + this.newFirstName() + " " + this.newMiddleInitial();    
        }

        return this.lastName() + ", " + this.firstName() + " " + this.middleInitial();
    }, this);
}
您可以对输入使用
checked
绑定,而不需要使用jQuery来处理更改

小提琴:

这将完美地工作
这将非常有效
这将非常有效
这将非常有效


我不是100%清楚你想要实现什么。如果您试图支持接受/取消,那么这可能会有所帮助。我很成功地使用了它,如果你接受这些变化,新的价值观只会被推到可观察的层面。我不是100%清楚你想要实现什么。如果您试图支持接受/取消,那么这可能会有所帮助。我很成功地使用了它,如果你接受这些变化,新的价值观只会被推到可观察的层面。我不是100%清楚你想要实现什么。如果您试图支持接受/取消,那么这可能会有所帮助。我很成功地使用了它,如果你接受这些变化,新的价值观只会被推到可观察的层面。我不是100%清楚你想要实现什么。如果您试图支持接受/取消,那么这可能会有所帮助。我非常成功地使用了它,如果您接受这些更改,新的值只会被推送到可观察的对象上。我喜欢您的答案,因为a)它干净简单,b)jsfiddle链接有助于看到它的运行。我将尝试将其合并到我的代码中,看看它是如何工作的。我感谢你的帮助(当然还有其他的回答)。@beaudetious我认为这个答案有问题==>RPNiemeyer将他的“新”模型变量绑定到相同的“原始”表单
INPUT
s,而不是“新”表单INPUT。我认为这是一个错误。。。无论是否选中,它都会与原始的3个输入保持一致吗?@fd2g-这些值只是根据原始提供的值初始化的。从那时起,他们将有自己的生活,并分别与输入绑定。当有人检查它是否是名称更改时,值将默认为原始值。这是一个非常酷的技巧。。。不管怎样,答案都很漂亮。。。毕竟,你是击倒神:-)只是想知道这是否是OP每次点击时都希望重置原始值的愿望@美女:那是你想要的吗?或者您是否希望第二组“新”的
输入
s记住它们的值/无论您做了什么