2012-05-15 36 views
9

所以我有一個非常奇怪的問題,因爲knockoutjs點擊綁定沒有附加到錨點標籤。其他數據綁定=「」的作品,但不是點擊綁定。knockoutjs點擊綁定不能在嵌套的foreach工作

下面你可以看到視圖模型JS的HTML和零件文件

var tag = function (data) { 
    this.count = data.Count; 
    this.id = data.Id; 
    this.title = data.Title; 
    this.tagGroup = data.TagGroup; 
}; 
var tagContainer = function (data) { 
    this.tagList = $.map(data.Tags, function (item) { return new tag(item); }); 
    this.letter = ko.observable(data.Letter); 
}; 

var searchViewModel = function(){ 
    var self = this; 

    self.tagContainerList = ko.observableArray([]); 

    self.addFilter = function (tag) { 
    //move tag to active filters and do some more cool stuff here 
    }; 


}; 

<div id="modal-all-tags" data-bind="with:searchViewModel"> 
    <ul data-bind="foreach:tagContainerList"> 
     <li> 
      <span data-bind="text:$data.letter()"></span> 
      <ul data-bind="foreach:tagList"> 
       <li><a href="#" data-bind="click:$root.addFilter"><span data-bind="text:title"></span></a></li> 

      </ul> 
     </li> 
    </ul> 

     <a class="close-reveal-modal">&#215;</a> 
</div> 

它基本上是一個模式彈出及其加載時用戶點擊頁面上的鏈接。 我向服務器發送一個請求,並返回我標籤容器的列表中的每個都起始號和標籤列表信下方呈現: 一個 一個字1 一個字2 乙 乙字1 乙字2 ç ç字1 ç字2

等等...

的字母正確呈現A,b,C各得到呈現在它們下面用正確的標籤列表文字:標題正確顯示。

除了addFilter();函數,我想綁定到標籤列表中的每個鏈接。瀏覽器只是跳轉,並添加一個哈希字符的URL。 Firebug在綁定中也沒有顯示任何錯誤。

div容器有一個with:searchViewModel的原因是因爲整個頁面都有一個主視圖模型。但這並不重要,因爲它正在項目的每個其他頁面上工作。

我能想到的唯一的事情是,點擊綁定$ root.addFilter是錯誤的,但我試圖只是addFilter在哪裏螢火蟲給出的錯誤「addFilter沒有定義;」

而且我試了$ parent和$ root。

有沒有人有任何建議?

+3

你會解釋你是如何解決它,我將非常感激。 –

回答

15

我以爲有一個想法。你addFilter功能需要一個參數(tag),但你不傳遞任何東西的結合:

<a href="#" data-bind="click:$root.addFilter"> 

難道這是問題嗎?

也許沿着線的東西:

<a href="#" data-bind="click:function() { $root.addFilter($data) }"> 

將幫助?

+1

不幸的是無法獲得$ parent.addFilter不是用$ root嘗試的函數。但它確實給了我一個想法,我會用這種方法嘗試一些事情。 – Kimpo

+0

仍然沒有運氣,我在頁面的其他部分使用click:addFilter,您可以添加搜索過濾器,並且如果您在通過可觀察數組迭代時調用函數,通常不需要$ data – Kimpo

+0

對不起那。你說「Firebug在綁定上也沒有顯示任何錯誤。「這意味着你的addFilter函數會被調用,否則會引發一個錯誤。你是否嘗試過在addFilter函數上放置一個斷點(我發現Chrome非常適合調試knockout)並且看看函數內部是否存在問題?我建議你檢查標籤參數中傳遞的內容,看看是否是問題 –

3

我碰到類似的東西,起初我跑data-bind="click:function() { console.log($parents) }"。請注意,其$parents不是$parent。我期待找到上下文,我需要的東西看起來像data-bind="click:$parents[1].onCardClick"

+0

Xerri提供了一個非常可行的解決方案,我陷入了完全相同的情況,並解決了我的問題。只改變我所做的就是把圓括號data-bind =「點擊:$ parents [1] .onCardClick(),它起到了魅力的作用。 –