我有下面的代码,我很困惑为什么显示第一个视图模型(vm1)而不是第二个视图模型(vm2)的第二个警报?
<div id="main">
<div data-bind="testBinding: vm1"></div>
<div data-bind="testBinding: vm2"></div>
</div>
<script>
function vm1() {
this.firstName = "test first name"
}
function vm2() {
this.lastName = 'test last name';
}
ko.bindingHandlers.testBinding = {
init: function(element, valueAccessor, allBindings, viewModel,
bindingContext) {
alert(JSON.stringify(bindingContext.$data))
},
};
ko.applyBindings(new vm1(), document.getElementById('main'));
</script>
答案 0 :(得分:1)
它只显示第一个ViewModel(vm1),因为当你应用绑定时,你传递了vm1的viewmodel。
ko.applyBindings(new vm1(), document.getElementById('main'));
此外,来自bindingContext
的{{1}}参数会为您提供传递给ko.bindingHandlers
的viewModel。由于您在绑定期间传递了第一个视图模型,因此您只能获取该信息。
http://knockoutjs.com/documentation/custom-bindings.html
如果您想从ko.applyBinidngs
同时获取v1和v2,您可以创建另一个视图模型并为每个视图模型创建2个属性。
ko.bindingHandlers
然后你会在警告框中得到这个结果
function vm1() {
this.firstName = "test first name"
}
function vm2() {
this.lastName = 'test last name';
}
function viewModel() {
this.vm1 = new vm1();
this.vm2 = new vm2();
}
ko.bindingHandlers.testBinding = {
init: function(element, valueAccessor, allBindings, viewModel,
bindingContext) {
alert(JSON.stringify(bindingContext.$data))
},
};
ko.applyBindings(new viewModel(), document.getElementById('main'));