敲除启用javascript

敲除启用javascript,javascript,knockout.js,Javascript,Knockout.js,我正在努力理解击倒。还有一件事我不明白。我们有html: <p> <input type='checkbox' data-bind="checked: hasCellphone" /> I have a cellphone</p> <p> Your cellphone number: <input type='text' name='cell' data-bind="value: cellphoneNumber, enable: hasCe

我正在努力理解击倒。还有一件事我不明白。我们有html:

<p>
<input type='checkbox' data-bind="checked: hasCellphone" />
I have a cellphone</p>

<p>
Your cellphone number:
<input type='text' name='cell' data-bind="value: cellphoneNumber, enable: hasCellphone" /></p>

<button data-bind="enable: document.getElementsByName("cell")[0].value != '555'">
Do something</button>

因此,启用输入有效,但不适用于按钮,即使我在输入中输入“555”,它仍然保持启用状态。

您需要启用条件为可观察状态,否则敲除不会检查值是否已更改。您刚刚将其绑定到一个html元素,该元素在其值发生更改时不会通知knockout。如果您尝试以下操作,会发生什么情况:

<button data-bind="enable: cellphoneNumber() != '555'">Do something</button>

您需要使enable条件是可观察的,否则knockout不会检查值是否已更改。您刚刚将其绑定到一个html元素,该元素在其值发生更改时不会通知knockout。如果您尝试以下操作,会发生什么情况:

<button data-bind="enable: cellphoneNumber() != '555'">Do something</button>

淘汰页面上的例子有点误导。启用绑定接受任何值,但对于自动更新,它必须是可观察的。document.getElementsByNamecell[0]。值!='555'不是可观察到的

通过将cellphoneNumber observable添加到基于cellphoneNumber observable值的模型中,可以轻松修复代码:

html JSFIDLE
淘汰页面上的例子有点误导。启用绑定接受任何值,但对于自动更新,它必须是可观察的。document.getElementsByNamecell[0]。值!='555'不是可观察到的

通过将cellphoneNumber observable添加到基于cellphoneNumber observable值的模型中,可以轻松修复代码:

html JSFIDLE
这里是最简单的方法,尤其是如果你不想改变你的模型。非常感谢你的回答


这里是最简单的方法,尤其是如果你不想改变你的模型。非常感谢你的回答


你的parseAreaCode方法是什么?它确实返回了正确的值吗?对不起,这里的代码错误,我刚刚从这里复制了它,我将在尝试使用它时进行编辑。哦!然后发布您的代码,因为只要您正确地实现了parseAreaCode,您发布的内容就应该有效。您的parseAreaCode方法是什么?它确实返回了正确的值吗?对不起,这里的代码错误,我刚刚从这里复制了它,我将在尝试使用它时进行编辑。哦!然后发布您的代码,因为您发布的内容应该有效,只要您正确地实现parseAreaCode。创建了一个提琴来说明这一点,但这个答案更快:-想自己完成,但您的速度更快了:非常感谢。上面的答案不起作用,尽管我只是添加了一个伪parseAreaCode函数并添加了valueUpdate参数。这是一个常见的错误,给人的印象是它不起作用。制作了一把小提琴来说明这一点,但这个答案更快:-我想自己做,但你做得更快了:非常感谢。上面的答案不起作用,尽管我只是添加了一个伪parseAreaCode函数并添加了valueUpdate参数。这是一个常见的错误,给人的印象是它不起作用。然后,您需要一个计算的可观测值,如bikeshedder提供的:此解决方案也可以工作,但需要取消对电话号码输入字段的聚焦。如果您想更新每个按键上可观察到的cellphoneNumber,您可以使用valueUpdate参数:然后您需要一个计算出的可观察值,如bikeshedder提供的:此解决方案也可以工作,但需要取消对电话号码输入字段的聚焦。如果要更新每个按键上可观察到的cellphoneNumber,可以使用valueUpdate参数:
<p>
    <input type='checkbox' data-bind="checked: hasCellphone" />
    I have a cellphone
</p>

<p>
    Your cellphone number:
    <input type='text' name='cell' data-bind="
            value: cellphoneNumber,
            valueUpdate: 'afterkeydown',
            enable: hasCellphone" />
</p>
function parseAreaCode(s) {
    // just a dummy implementation
    return s.substr(0, 3);
}

function AppViewModel() {   
    this.hasCellphone = ko.observable(false);
    this.cellphoneNumber = ko.observable("");
    this.cellphoneNumberValid = ko.computed(function() {
        return parseAreaCode(this.cellphoneNumber()) != '555';
    }, this);
}

ko.applyBindings(new AppViewModel());
<p><input type='checkbox' data-bind="checked: hasCellphone" />
I have a cellphone</p>
<p>Your cellphone number:
<input type='text' data-bind="value: cellphoneNumber, valueUpdate: 'afterkeydown', enable: hasCellphone" /></p>
<button data-bind="enable: cellphoneNumber().trim().substr(0,3) !='555'">Do something</button>

function AppViewModel() {   
this.hasCellphone = ko.observable(false);
this.cellphoneNumber = ko.observable("");}
ko.applyBindings(new AppViewModel());