【问题标题】:KnockoutJS setting focus after adding to array/collection添加到数组/集合后,KnockoutJS 设置焦点
【发布时间】:2013-11-12 21:17:04
【问题描述】:

我有带有一系列诊断代码的视图模型。在我的 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>

【问题讨论】:

    标签: javascript knockout.js


    【解决方案1】:

    使用内置绑定 hasFocus 并将其设置为 true

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

    http://jsfiddle.net/eT3Y8/

    【讨论】:

    • 很好,忘记了hasFocus
    【解决方案2】:

    可以通过自定义绑定来完成。这种方法更难的部分是不要关注最初在列表中的元素框。这就是为什么我需要一个额外的 isNew 属性,这对于已经存在的元素是错误的。我还用 jquery 来聚焦 :) Fiddle: 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());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-19
      • 1970-01-01
      • 2017-06-09
      • 1970-01-01
      • 2013-09-01
      相关资源
      最近更新 更多