使用Knockout.js选择()输入字段

Qua*_*Van 10 select focus input viewmodel knockout.js

我是Knockout.js的新手.

什么是最好的,以这样select()<input />,当它变得可见?

视图:

<p>
    Name: 
    <b data-bind="visible: !editing(), text: name, click: edit">&nbsp;</b>
    <input data-bind="visible: editing, value: name, hasfocus: editing" />
</p>
Run Code Online (Sandbox Code Playgroud)

视图模型:

function PersonViewModel(name) {
    // Data
    this.name = ko.observable(name);
    this.editing = ko.observable(false);

    // Behaviors
    this.edit = function() { this.editing(true) }
}

ko.applyBindings(new PersonViewModel("Bert Bertington"));
Run Code Online (Sandbox Code Playgroud)

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

http://jsfiddle.net/RnCUd/

谢谢!

Joh*_*les 19

您可以创建新的绑定来处理选择.

ko.bindingHandlers.selected = {
    update: function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
        var selected = ko.utils.unwrapObservable(valueAccessor());
        if (selected) element.select();
    }
};
Run Code Online (Sandbox Code Playgroud)

将此绑定添加到输入字段.

<input data-bind="visible: editing, value: name, hasfocus: editing, selected: editing" />
Run Code Online (Sandbox Code Playgroud)

这是一个小提琴:http://jsfiddle.net/RnCUd/2/


或者,您可以创建一个包装hasfocus绑定的自定义绑定:

ko.bindingHandlers.hasSelectedFocus = {
    init: function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
        ko.bindingHandlers['hasfocus'].init(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext);
    },        
    update: function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
        ko.bindingHandlers['hasfocus'].update(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext);        

        var selected = ko.utils.unwrapObservable(valueAccessor());
        if (selected) element.select();
    }
};
Run Code Online (Sandbox Code Playgroud)

hasfocus如果observable为true,则此绑定仅将初始化和更新委托给并负责选择元素.用它代替hasfocus.

<input data-bind="visible: editing, value: name, hasSelectedFocus: editing" />
Run Code Online (Sandbox Code Playgroud)

这是一个小提琴:http://jsfiddle.net/RnCUd/1/

  • @QuangVan我会敦促你去了解自定义绑定.当问题跨越数据和DOM之间的界限并且无法通过标准绑定解决时,自定义绑定是正确的选择.我会说你应该随意"尽早"使用它们,就像你说的那样.它们是一个强大的工具,不需要万不得已. (2认同)