为什么第二个警报仍然显示第一个视图模型(vm1)?

时间:2017-05-20 03:44:14

标签: javascript knockout.js

我有下面的代码,我很困惑为什么显示第一个视图模型(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>

1 个答案:

答案 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'));

相关问题