2

我有带有一系列诊断代码的视图模型。在我的 html 中,我有一个数据绑定到单击的按钮,该单击将空白诊断代码添加到数组中。这一切都有效。

我想不通的是如何在添加代码时将焦点设置到动态添加的文本框。我可以添加什么:

<h3>Diagnosis Codes<input type="button" value="Add" data-bind="click:AddDiagnosisCode"/></h3>
<div data-bind="foreach:DiagnosisCodes">
    <div><input type="text"  data-bind="value:$data"/>
    </div>
</div>

<script type="text/javascript">
    function AddDiagnosisCode(item)
    {
        item.DiagnosisCodes.push("");
    }

    var vm = {
       "DiagnosisCodes": ["2345","6789"]
    };

    var viewModel = ko.mapping.fromJS(vm);     
     ko.applyBindings(viewModel);
</script>
4

2 回答 2

10

Use the built-in binding hasFocus and set it to true

<input type="text" data-bind="value:$data, hasFocus: true">

See http://jsfiddle.net/eT3Y8/

于 2013-11-01T16:34:23.133 回答
1

它可以通过自定义绑定来完成。这种方法更难的部分是不要关注最初在列表中的元素框。这就是为什么我需要一个额外的 isNew 属性,这对于已经存在的元素是错误的。我还使用 jquery 来集中注意力:) 小提琴:http: //jsfiddle.net/hv9Dx/1/

html:

<h3>Diagnosis Codes<input type="button" value="Add" data-bind="click:AddDiagnosisCode"/></h3>
<div data-bind="foreach:DiagnosisCodes">
    <div><input type="text"  data-bind="value:value, focusOnCreate:isNew()"/>
    </div>
</div>

js:

var Record = function(value, isNew){
    var self = this;
    self.value = ko.observable(value);
    self.isNew = ko.observable(isNew || false);
}

var VM = function() {
    var self = this;    
    self.DiagnosisCodes = ko.observableArray([
        new Record("2345"),
        new Record("6789")]);
    self.enableFocus = ko.observable(true);
    self.AddDiagnosisCode = function(){
        self.DiagnosisCodes.push(new Record("", true));
    }
}

ko.bindingHandlers.focusOnCreate = {
    init:function(element, valueAccessor, allBindings, viewModel, bindingContext) {
        if(valueAccessor()){
            $(element).focus();
        }
    }
}

     ko.applyBindings(new VM());
于 2013-11-01T16:28:51.570 回答