2016-02-20 53 views
0

我學習Knockout.js並使用with:binding更改綁定上下文如下:淘汰賽:XXX是不是一個函數錯誤

HTML:

<div id="wrap" data-bind="with: currentCat()"> 

    <h2 data-bind="text: name"></h2> 
    <h3 data-bind="text: level"></h3> 
    <div data-bind="text: count"></div> 
    <img src="" alt="cute cat" data-bind="click: $parent.incrementCounter, attr: {src: imgSrc}"> 

</div> 

的Javascript:

var cat = function() { 
    this.name = ko.observable("Fossie"); 
    this.imgSrc = ko.observable("--"); 
    this.count = ko.observable(0); 
    this.nicknames = ko.observableArray(["Meow", "Johnny"]); 
}; 

var viewModel = function() { 

    this.currentCat = ko.observable(new cat()); 
    this.incrementCounter = function() { 
     this.currentCat().count(this.currentCat().count() + 1); 
    } 

}; 
ko.applyBindings(new viewModel()); 

當我點擊圖片時,出現此錯誤:

Uncaught TypeError: this.currentCat is not a function

相同的代碼沒有使用with綁定工作。任何人都可以請解釋我更改上下文後更改了什麼?

回答

3

this當用作事件處理程序時會丟失其上下文。使用.bind

this.incrementCounter = function() { 
    this.currentCat().count(this.currentCat().count() + 1); 
}.bind(this); 
+0

哇,這解決了這個問題。謝謝你,先生。您能否詳細說明'當作爲事件處理程序使用時,它會丟失它的上下文'以及綁定如何解決該問題? – akshayKhot

+0

@akshayKhot http://stackoverflow.com/questions/20279484/how-to-access-the-correct-this-context-inside-a-callback –

+0

謝謝你的鏈接。在使用'with'之前,我有'data-bind ='單擊:incrementCounter'和同樣的JS沒有綁定。它那時工作。'with'怎麼會使它失敗? – akshayKhot