Knockout.js 敲除自定义绑定多次激发

Knockout.js 敲除自定义绑定多次激发,knockout.js,knockout-2.0,Knockout.js,Knockout 2.0,我目前正在尝试为我的网页创建一个自定义绑定,其中我有一个可见的跨度和隐藏的输入元素。如果我要单击范围,它将消失,输入将出现。一旦输入失去焦点,范围将用输入的新值更新。但是,由于某种原因,每次单击span时,blur函数都会再次绑定,这不是我想要的。我怎样才能解决这个问题 HTML 所以,如果我点击我的跨度两次,我会 firing firing firing 在我的控制台中,当我只需要发射两次时 注意:我无法遵循淘汰教程中的hasFocus示例,因为它绑定到所有输入字段,我需要我的输入字段仅为正

我目前正在尝试为我的网页创建一个自定义绑定,其中我有一个可见的跨度和隐藏的输入元素。如果我要单击范围,它将消失,输入将出现。一旦输入失去焦点,范围将用输入的新值更新。但是,由于某种原因,每次单击span时,
blur
函数都会再次绑定,这不是我想要的。我怎样才能解决这个问题

HTML

所以,如果我点击我的跨度两次,我会

firing
firing
firing
在我的控制台中,当我只需要发射两次


注意:我无法遵循淘汰教程中的
hasFocus
示例,因为它绑定到所有输入字段,我需要我的输入字段仅为正在单击的特定范围进行切换。

这一点都不神秘。看看这个代码:

$(element).click(function() {
    /* some code */
    $(inputName).blur(function() {
        /* some code */
    });
});
每次单击时,都会添加
blur
处理程序。您可以尝试删除如下处理程序:

$(element).click(function() {
    var $element = $(this);
    var index = valueAccessor();
    var inputName = "input[name="+index+"]";
    var $input = $(inputName);
    $element.addClass("hide");
    $input.unbind('blur');
    $inputName.removeClass("hide").focus().blur(function() {
        console.log("firing");
        $input.addClass("hide");
        $element.removeClass("hide");
        $element.text($input.val());
    });
});

我想你可以链接它,但没有测试它。

我不敢相信它这么简单!谢谢不过,我不需要第二个unbind函数<代码>$(inputName).unbind('blur')
足以使代码正常工作。@WeiHao当然。我错把第二个
解开了。我已经编辑了代码。:)顺便说一下:我对你的代码进行了一些重构,缓存了一些变量以提高效率。
$(element).click(function() {
    /* some code */
    $(inputName).blur(function() {
        /* some code */
    });
});
$(element).click(function() {
    var $element = $(this);
    var index = valueAccessor();
    var inputName = "input[name="+index+"]";
    var $input = $(inputName);
    $element.addClass("hide");
    $input.unbind('blur');
    $inputName.removeClass("hide").focus().blur(function() {
        console.log("firing");
        $input.addClass("hide");
        $element.removeClass("hide");
        $element.text($input.val());
    });
});