我有一个包含诊断代码数组的viewmodel。在我的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>
答案 0 :(得分:10)
使用内置绑定hasFocus并将其设置为true
<input type="text" data-bind="value:$data, hasFocus: true">
答案 1 :(得分: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());