javascript - 为什么第二个警报仍然显示第一个 View 模型 (vm1)?

标签 javascript knockout.js

我有以下代码,但我很困惑为什么第二个警报显示第一个 View 模型 (vm1) 而不是第二个 View 模型 (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>

最佳答案

它显示第一个 ViewModel (vm1) 只是因为当您应用绑定(bind)时,您传递了 vm1 的 View 模型。

ko.applyBindings(new vm1(), document.getElementById('main'));

此外,来自 ko.bindingHandlersbindingContext 参数将获取传递给 ko.applyBinidngs 的 viewModel。由于您在绑定(bind)期间传递了第一个 View 模型,因此您只能获得该信息。

http://knockoutjs.com/documentation/custom-bindings.html

如果您想从 ko.bindingHandlers 获取 v1 和 v2,您可以创建另一个 View 模型并为每个 View 模型创建 2 个属性。

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

然后您将在警报框中看到此结果

{"vm1":{"firstName":"测试名字"},"vm2":{"lastName":"测试姓氏"}}

关于javascript - 为什么第二个警报仍然显示第一个 View 模型 (vm1)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44081696/

相关文章:

java - org.apache.commons.fileupload.FileUploadException : the request was rejected because no multipart boundary was found

javascript - 响应式问题 JQzoom

javascript - 将 JavaScript 变量传递到 HTML

javascript - KnockoutJS - 依赖可观察量或计算可观察量

javascript - 单击按钮时映射在 knockout 中不起作用

javascript - "Error: Couldn' t 找不到 Opus 引擎。”尝试播放 mp3 文件时 (discord.js)

javascript - 谁能帮我分离世博会应用程序

knockout.js - knockout : working example for editable grid

javascript - 通过 knockout 以编程方式应用可见绑定(bind)

javascript - Durandal : Widget's activate callback not behaving like a regular viewmodel's callback