【问题标题】:Why is the second alert still displaying the first view model (vm1)?为什么第二个警报仍然显示第一个视图模型 (vm1)?
【发布时间】:2017-10-20 06:30:57
【问题描述】:

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

【问题讨论】:

  • 因为您在应用绑定时从 vm1 new vm1() 创建了视图模型。
  • @M.Ihsan 这不应该没关系,因为我正在寻找主 div 中的所有绑定,对吧? stackoverflow.com/questions/18990244/…
  • 没错,您正在查看主 div 中的所有绑定。但是你没有绑定vm2,这就是为什么你在那里看不到它的原因。看看我下面的答案。

标签: javascript knockout.js


【解决方案1】:

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

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

此外,来自ko.bindingHandlersbindingContext 参数将为您提供您传递给ko.applyBinidngs 的viewModel。由于您在绑定期间传递了第一个视图模型,因此您只会获得该信息。

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

如果您想从 ko.bindingHandlers 获取 v1 和 v2,您可以创建另一个视图模型并为每个视图模型创建 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":"test first name"},"vm2":{"lastName":"test last name"}}

【讨论】:

  • 谢谢你的回答很有道理!有没有办法使用模板绑定创建子上下文?
猜你喜欢
  • 2020-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-10
  • 1970-01-01
相关资源
最近更新 更多