Knockout.js 在按键和单击事件时更新可观察到的事件

Knockout.js 在按键和单击事件时更新可观察到的事件,knockout.js,knockout-2.0,Knockout.js,Knockout 2.0,我有一个如下所示的值绑定: <textarea class="form-control" placeholder="Comments" rows="10" data-bind="value: $root.GetTabComment($data).Comment, valueUpdate: 'keyup'"></textarea> 单击按钮时,是否有办法强制绑定采用文本区域的当前值?您可以尝试使用输入来代替键控: valueUpdate: 'input' : <p

我有一个如下所示的值绑定:

<textarea class="form-control" placeholder="Comments" rows="10" data-bind="value: $root.GetTabComment($data).Comment, valueUpdate: 'keyup'"></textarea>

单击按钮时,是否有办法强制绑定采用文本区域的当前值?

您可以尝试使用
输入来代替
键控

valueUpdate: 'input'

<p>Type stuff here: 
    <input data-bind='value: instantaneousValue, valueUpdate: "input"' /></p>

<p>Current throttled value: <b data-bind='text: throttledValue'> </b></p>

<div data-bind="visible: loggedValues().length > 0">
    <h3>Stuff you have typed:</h3>
    <ul data-bind="foreach: loggedValues">
        <li data-bind="text: $data"></li>
    </ul>
</div>
function AppViewModel() {
    this.instantaneousValue = ko.observable();
    this.throttledValue = ko.computed(this.instantaneousValue)
                            .extend({ throttle: 400 });

    // Keep a log of the throttled values
    this.loggedValues = ko.observableArray([]);
    this.throttledValue.subscribe(function (val) {
        if (val !== '')
            this.loggedValues.push(val);
    }, this);
}

ko.applyBindings(new AppViewModel());
“输入”-当或元素的值更改时更新视图模型。请注意,此事件仅由相当现代的浏览器(例如IE 9+)引发

下面是我发现并改编的一个示例JSFIDLE(),它说明了它的用法,它处理按键和鼠标点击以及节流:

HTML:

<p>Type stuff here: 
    <input data-bind='value: instantaneousValue, valueUpdate: "input"' /></p>

<p>Current throttled value: <b data-bind='text: throttledValue'> </b></p>

<div data-bind="visible: loggedValues().length > 0">
    <h3>Stuff you have typed:</h3>
    <ul data-bind="foreach: loggedValues">
        <li data-bind="text: $data"></li>
    </ul>
</div>
function AppViewModel() {
    this.instantaneousValue = ko.observable();
    this.throttledValue = ko.computed(this.instantaneousValue)
                            .extend({ throttle: 400 });

    // Keep a log of the throttled values
    this.loggedValues = ko.observableArray([]);
    this.throttledValue.subscribe(function (val) {
        if (val !== '')
            this.loggedValues.push(val);
    }, this);
}

ko.applyBindings(new AppViewModel());

textInput
对于“键入时另存”更好

您只需将
值:
替换为
文本输入:

它可以更好地处理浏览器差异


它多久保存一次?你用的是可观察的吗?是的,它是可观察的。每当绑定更新时,它都会保存,我使用了
.extend{throttle:1000}
,这样它就不会在每次击键时都这样做。您是否考虑过订阅可观察到的并从那里启动限制更新,而不是使用valueUpdate?或者你已经这么做了?我只是编辑了这篇文章,让细节更清楚。对不起,搞乱了JS的小提琴链接,现在修好了。这很好用!谢谢不知何故,我忽略了这是
valueUpdate
的一个选项。单击元素时,这是否起作用,是否与jQuery相同。让我回顾一下。(您仍然可以限制它以避免数据库饱和)