1

在我的JS中,我有以下ajax調用,它使用挖空映射插件綁定生成的json。knockout.mapping.js,是否有可能僅更新映射變量的一部分?

$.getJSON("/Game/GetRack", function (data) { 
    game.rack = ko.mapping.fromJS(data); 
    ko.applyBindings(game.rack, $('.rack')[0]); 
}); 

/Get/GetRack回報:

[{"Color":3,"Letter":"a","Points":5},null,null]

正如你所看到的,只有一個數組中的對象。另外兩個是空值。

現在使用的淘汰賽映射我可以這樣做:

ko.mapping.fromJS([null, { Color: 55, Letter: "b", Points: 88 }, null], game.rack); 

這樣做正確更新我的看法,現在我只看到在第二位置的字母B。另外兩個是空值。

我的問題是:我可以在不使用mapping.fromJS的情況下更新特定位置的值嗎?

因此,假設我有一個字母A在索引0,我想第二個空更改爲
{ Color: 55, Letter: "b", Points: 88 }
,讓我的用戶界面自動更新到類似這種變化。如何才能做到這一點?


編輯:

我決定去與約翰Earles給出的例子。不幸的是我仍然有一個問題,因爲我的數組是二維的。

您在這裏有一個例子: http://jsfiddle.net/wgZ59/29/
(它非常類似於約翰Earles'的例子,但包括二維陣列)。

有人能指出爲什麼點擊更改按鈕不會改變元素的值嗎?是否也可以在不調用HasMutated()的情況下更改它們的值?

最後一個(只有前兩個解決了)。是否可以靜態創建html表格(因爲例如我知道它總是3x3,所以我想要兩個具有3行和3列的打印表格,然後將每個單獨的單元格綁定到我的矩陣單元格中。問題,因爲淘汰賽沒有爲單元格中的數值...


EDIT2:

我設法回答我上面的問題我自己,小提琴例子是在這裏:

http://jsfiddle.net/wgZ59/44/

所以,我可以E中的靜態表和結合的單個細胞,當我聲明數組這樣:

self.matrix = ko.observableArray([[0,0,0],[0,0,0],[0,0,0]]);

self.matrix = ko.observableArray([[,,],[,,],[,,]]);

我可以更新的價值和它的工作原理爲靜態表,但它並不適用於動態表(淘汰賽動態創建的)工作。您可以在小提琴頁面上看到行爲(在編輯開始時鏈接)。你知道爲什麼按下「更改」按鈕不會更新動態創建的表中的值嗎?

回答

2

我不知道到底是什麼你正在嘗試做的,但如果game.rack是observableArray那麼你可以使用JavaScript操縱它。

這裏是observableArrays文檔頁面:

http://knockoutjs.com/documentation/observableArrays.html

頁面所顯示可用的「助手」的方法可用在observableArray本身。此外,您可以操作底層數組,但是您必須在observableArray上調用'valueHasMutated()'以讓任何已註冊的偵聽器知道這些更改。

下面是一個簡單的jsfiddle顯示操作:

http://jsfiddle.net/jearles/wgZ59/8/

+0

感謝約翰。我決定遵循你的設計模式,但我仍然有問題。你能看看我的編輯? – 2012-02-26 21:17:23

+1

淘汰賽真的只是喜歡與物體一起工作。依賴性跟蹤在跟蹤$數據引用時遇到了問題。下面的小提琴奏效,但它需要你改變成一個簡單的對象數組:[{v:1},{v:2},{v:3}]。 http://jsfiddle.net/jearles/wgZ59/46/使用對象的一個​​好處是映射器會將它們變成可觀察對象,並且由於您現在正在更改可觀察對象,因此不需要'valueHasMutated()'調用了。 – 2012-02-26 23:59:26

+0

我在原始場景中使用對象。我只是不知道這可能會影響我發佈在jsfiddle上的情況。我可以從這裏繼續,再次感謝:)。 – 2012-02-27 08:30:29

相關問題