2012-07-31 32 views
0

我有一個來自REST API的JSON數組。我正在使用Knockout映射插件來處理數組,並將JSON加載到預設的表單值中(如果用戶之前已將值添加到表單中 - 我有數據來測試Knockout數組)。該表格實質上添加或刪除了帶有輸入的div塊,以便用戶可以添加/刪除「工作」體驗。Knockout Mapping插件 - 捕獲數組值

我的問題是試圖破譯插件如何映射數組。我試圖在數組中找到某行的特定值(id),以便我可以將其添加爲變量以告訴API刪除該特定行。我可以讓Knockout顯式輸出HTML中的行值,但我無法弄清楚如何捕獲它。在模板「foreach」中,我有一個引用「remove:」的按鈕,這就是我試圖捕獲數組中值的地方。

對於在HTML示例:

此輸出「工作」的兩排對象沒有問題:

<span data-bind="text: ko.mapping.toJSON(workModel.work())"></span> 

[{"id":"1","schoolID":"2","place":"","position":"Science Teacher","description":"I worked at ASD for 1 year as a Science teacher.","start":"2011","end":"2012","profileID":"91"},{"id":"2","schoolID":"1","place":"American School of Taiwan","position":"Science Guy","description":"I was just another science guy","start":"2008","end":"2011","profileID":"91"}] 

此輸出陣列中的第一行和項的ID:

<span data-bind="text: ko.mapping.toJSON(workModel.work()[0].id)"></span> 
"1" 

但在JavaScript中,如果你點擊通過在foreach模板生成的刪除按鈕...

gone = function(work) { 

     alert(ko.mapping.toJSON(workModel.work(this).id)); 

    } 

在Firebug中給我這個錯誤,然後UI重新加載並刪除我剛纔單擊的模板塊。

Unable to parse bindings. Message: TypeError: workModel.work()[0] is undefined; Bindings value: text: ko.mapping.toJSON(workModel.work()[0].id) 

即使這樣,如果我取代了明確的聲明上述警報:

gone = function(work) { 

     alert(ko.mapping.toJSON(workModel.work()[0].id)); 

     } 

我得到的「1」的正確值一次。我知道它與代碼的「this」方面有關,但我不確定映射插件正在做什麼,以便我可以捕獲陣列中的特定值......有道理?任何幫助將不勝感激。

回答

0

我在這裏出去走走,但我確實認爲這是這個問題。使用Javascript進行作用域有時可能是一件麻煩事。嘗試做這樣的事情的範圍內包含了功能:

var self = this; 
gone = function(work) { 
    alert(ko.mapping.toJSON(workModel.work(self).id)); 
} 

免責聲明:我不能現在就這個測試自己,但給它一個嘗試:)

+0

對不起,試了一下,沒有去。如果我只是做一個簡單的'alert(self.workModel.work()。length);'我得到了所有數組的正確值。這只是我看不到的一個價值。 – user1557966 2012-07-31 16:45:42

+0

我h你需要發佈更多的代碼。請發佈更完整的標記和JavaScript。 – 2012-07-31 17:02:05

0

我終於得到它了。它來自堆棧溢出的不同帖子,也來自Knockout論壇。我相信其他人有比這更優雅的解決方案,但它適用於我。

在「刪除」的foreach循環(或您要使用捕捉值的任何按鈕)按鈕我包括在數據綁定如下:在JavaScript我有

<a href="" class="btn" data-bind="click: function() { remove($data.id()); }">Remove</a> 

然後:

var self = this; 
var row_id; 

self.remove = function(index){ 
      var row_id = index; 
      alert(row_id); 

    } 

該警報按照我的意願返回已加載的JSON的行ID。 $ data.id()可以被改變/用於從加載的JSON中返回任何映射元素。 row_id是一個全局的,可以在其他地方訪問。

相關問題