在按键和单击事件上更新observable

时间:2014-09-09 14:31:43

标签: knockout.js knockout-2.0

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

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

我使用keyup的原因是因为我有一个“按键输出时保存”系统设置。这在用户键入时效果很好,但是如果他们通过拼写检查来纠正拼写(使用鼠标点击而根本没有键盘),则绑定将不会更新。

绑定变量Comment声明为:

Comment = ko.observable("").extend({throttle: 1000})

订阅只是:

Comment.subscribe(function(){
  //save code
});

单击按钮时,是否有某种方法可以强制绑定获取文本区域的当前值?

2 个答案:

答案 0 :(得分:5)

您可以尝试使用keyup

,而不是使用input
valueUpdate: 'input'

<强> KnockoutJS - The "value" binding

  

&#34;输入&#34; - 当&lt; input&gt;的值时更新您的视图模型或&lt; textarea&gt;元素变化。请注意,此事件仅由相当现代的浏览器引发(例如,IE 9 +)。

以下是我发现并改编的示例JSFiddle(originally authored by Michael Best),说明了它的用法,它可以处理击键和鼠标点击以及限制:

Demo JSFiddle

<强> 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>

<强> JS:

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());

答案 1 :(得分:0)

Series更适合'保存时输入'

您只需将textInput替换为value:

即可

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

http://knockoutjs.com/documentation/textinput-binding.html