Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/472.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么第二个警报仍显示第一视图模型(vm1)?_Javascript_Knockout.js - Fatal编程技术网

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

Javascript 为什么第二个警报仍显示第一视图模型(vm1)?,javascript,knockout.js,Javascript,Knockout.js,我有下面的代码,我很困惑为什么第二个警报显示第一个视图模型(vm1)而不是第二个视图模型(vm2) 函数vm1(){ this.firstName=“测试名” } 函数vm2(){ this.lastName='测试姓氏'; } ko.bindingHandlers.testBinding={ init:函数(元素、valueAccessor、allBindings、viewModel、, 绑定(上下文){ 警报(JSON.stringify(bindingContext.$data)) },

我有下面的代码,我很困惑为什么第二个警报显示第一个视图模型(vm1)而不是第二个视图模型(vm2)


函数vm1(){
this.firstName=“测试名”
}
函数vm2(){
this.lastName='测试姓氏';
}
ko.bindingHandlers.testBinding={
init:函数(元素、valueAccessor、allBindings、viewModel、,
绑定(上下文){
警报(JSON.stringify(bindingContext.$data))
},
};
ko.applyBindings(newVM1(),document.getElementById('main');

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

ko.applyBindings(new vm1(), document.getElementById('main'));
另外,
ko.bindingHandlers
中的
bindingContext
参数将获得传递给
ko.applyBinidngs
的viewModel。由于在绑定过程中传递了第一个viewmodel,因此只能获得该信息

如果要从
ko.bindingHandlers
获取v1和v2,可以创建另一个viewmodel,并为每个viewmodel创建两个属性

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”}

因为在应用绑定时从vm1
new vm1()
创建viewmodel。@M.Ihsan这不重要吗,因为我正在寻找主div中的所有绑定,对吗?没错,您正在查看主div中的所有绑定。但是您没有绑定vm2,这就是为什么您在那里看不到它。请看下面我的答案。谢谢你的答案有道理!有没有一种方法可以使用模板绑定创建子上下文?
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'));