2017-07-04 53 views
1

请看看下面的代码:是否有可能在淘汰赛忽略“数据绑定=用......”

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
    <title></title> 
</head> 

<body> 
    <form data-bind="with: selectedMerchant"> 
     <h1 data-bind="text: name"></h1> 
     <button data-bind="click: show"> SHOW </button> 
    </form> 

    <script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-debug.js" type="text/javascript"></script> 
    <script> 
     function PartnersViewModel() { 
      self.selectedMerchant = ko.observable({'name': 'John'}); 
      self.show = function() { 
       alert(JSON.stringify(self.selectedMerchant())); 
      } 
     } 
     ko.applyBindings(new PartnersViewModel()); 
    </script> 
</body> 
</html> 

正如你可以看到,该行:

<form data-bind="with: selectedMerchant"> 

使对象selectedMerchant'形式的结合上下文这就是为什么“的内部h1'标签,我们将看到名为‘约翰’

然而,该行:。

<button data-bind="click: show"> SHOW </button> 

说(据我所知),一旦按钮被点击,方法“显示”里面对象'selectedMerchant'将被调用。当然这个方法在selectedMerchant中不存在,所以我期望看到一个错误。

令我惊讶的是,它工作正常,我得到一个弹出窗口说:

{'name': 'John'}

我不明白为什么knockout.js调用它是对象“selectedMerchant”之外的方法。有没有人有一个很好的解释?

回答

2

您从视图模型声明的开头处缺少var self = this;

没有宣布selfself.show = function() { ...声明window对象在全球show功能,这就是为什么KO可以找到这个处理程序。

因此,与正常申报self你的代码会给出预期的错误:Message: show is not defined

<script> 
    function PartnersViewModel() { 
     var self = this; 
     self.selectedMerchant = ko.observable({'name': 'John'}); 
     self.show = function() { 
      alert(JSON.stringify(self.selectedMerchant())); 
     } 
    } 
    ko.applyBindings(new PartnersViewModel()); 
</script>