【发布时间】:2015-07-06 12:19:29
【问题描述】:
单击绑定的 html 列表项时如何获取对根视图模型的引用?
我有一个使用 KnockoutJS 进行绑定的 ViewModel 闭包“类”。
ViewModel 拥有一个ko.observableArray,表示无序列表中的每个列表项。
// ViewModel Base
var ViewModel=( function(){
// ctor
function ViewModel(data,id){
// Publics
this.list=ko.observableArray([{name:'one'},{name:'two'},{name:'three'}]);
this.selectedItem=ko.observable(null);
};
// set "selectedItem" when user clicks an <li>
ViewModel.prototype.selectItem=function(){
// below works when using instantiated "vm1"
vm1.selectedItem(this);
// correctly reports the name property of the clicked list item
console.log(vm1.selectedItem().name);
};
// Return Publics
return(ViewModel);
})();
// Build a new view model
var vm1=new ViewModel();
// apply bindings
ko.applyBindings(vm1);
observableArray 绑定到一个 Html 无序列表。
点击列表项时,每个 html 列表项都会在 ViewModel 中触发 .selectItem。
<ul data-bind='foreach:list'>
<li class='item' data-bind='click: $root.selectItem' >
<span data-bind='text:name'></span>
</li>
</ul>
问题是……
在.selectItem 中,我需要在视图模型实例上设置selectedItem 属性。
但我看不到从 KnockoutJS 提供给 selectedItem 的 this 获取视图模型实例的方法。
直接使用 vm1 实例可以工作,但我不希望我的通用 ViewModel 绑定到使用对 vm1 的硬编码引用
// set "selectedItem" when user clicks an <li>
ViewModel.prototype.selectItem=function(){
// below fails when using "ViewModel" (and numerous other tries by me)
ViewModel.selectedItem(this); // error
console.log(vm1.selectedItem().name);
};
片段:
function log(){console.log.apply(console,arguments);}
// ViewModel Base
var ViewModel=( function(){
// ctor
function ViewModel(data,id){
// Publics
this.list=ko.observableArray([{name:'one'},{name:'two'},{name:'three'}]);
this.selectedItem=ko.observable(null);
};
// set "selectedItem" when user clicks an <li>
ViewModel.prototype.selectItem=function(){
// below works when using specified vm1
// below fails when using ViewModel.selectedItem(this)
vm1.selectedItem(this);
alert('Clicked on: '+vm1.selectedItem().name);
};
// Return Publics
return(ViewModel);
})();
// Build a new view model
var vm1=new ViewModel();
// apply bindings
ko.applyBindings(vm1);
<p>Click on a list item.</p>
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.3.0/knockout-min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<ul data-bind='foreach:list'>
<li class='item' data-bind='click: $root.selectItem' >
<span data-bind='text:name'></span>
</li>
</ul>
【问题讨论】:
标签: knockout.js