我遇到了與訂閱的更新沒有約束的淘汰賽模型的問題。我有一個C#MVC頁面,它將模型傳遞給模板,並將模板解析爲Json並作爲ViewModel作業的一部分傳遞給ko.applyBindings
。我訂閱了一個observable,它調用一個方法來執行viewModel數據的更新。不相干的東西掏出,並更名爲實例:淘汰賽映射不更新我的模型
var myViewModel = function (data) {
var self = this;
self.CurrentPage = ko.observable();
self.SomeComplexArray= ko.observableArray([]);
self.Pager().CurrentPage.subscribe(function (newPage) {
self.UpdateMyViewModel(newPage);
});
self.UpdateMyViewModel= function (newPage) {
var postData = { PageNumber: newPage };
$.post('/Article/GetMyModelSearchByPage', postData, function (data) {
ko.mapping.fromJS(data, {}, self);;
});
};
當我執行日誌記錄,我可以看到所有的數據,而這一切看起來是正確的。使用相同的方法來生成初始模型和更新後的模型。我在其他頁面上使用了這種技術,並且每次都完美無瑕。然而,在這種情況下,我正在尋找它來綁定/更新SomeComplexArray
,這只是沒有發生。如果我嘗試手動執行此操作,則無法在數組上得到空白的正確綁定。我想知道是否有什麼明顯的表現,我做錯了,我只是失去了理智。
編輯:我不知道ko.mapping可以指出爲罪魁禍首。標準模型更改也不會影響界面。這是一些不具有約束力的工作。我有一個可見綁定到數組長度的p元素和一個綁定到一個函數的div元素,該函數從SomeComplexArray中彈出項目。我可以在控制檯日誌中看到它正在執行其功能(並且隨後的點擊導致'undefined'沒有該功能)。但是,p元素從不顯示。最初的陣列只有2個項目,使一個單一的點擊清空它:
<p data-bind="visible: SomeComplexArray().length === 0">nothing found</p>
<div data-bind="click: function() { UpdateArray(); }">try it manually</div>
-- in js model
self.UpdateArray = function() {
console.log(self.SomeComplexArray());
console.log(self.SomeComplexArray().pop());
console.log(self.SomeComplexArray());
console.log(self.SomeComplexArray().pop());
console.log(self.SomeComplexArray());
});
編輯2:從評論@馬特Burland,我已經修改了的流行是如何調用和手動的方法現在的作品進行修改動態的元素。然而,ko.mapping仍然沒有像我期望的那樣運行。在測試中,我在調用ko.mapping和之後做了特定行的console.log。對可觀察陣列沒有改變。
數據是什麼樣的?它是一個JavaScript對象嗎? –
@ m.casey:這是一個JSON格式的POCO。在其上使用'JSON.parse()'提供了格式正確且可訪問的對象。 –
我之所以會問這個問題,ko.mapping.fromJS()期望'data'應該是一個JavaScript對象,所以如果我們傳遞'data'而'data'當時仍然是一個JSON對象,它不會工作,對吧?此外,不確定這是否僅僅是複製/粘貼問題,但映射語句末尾存在語法錯誤,$ .post函數後面缺少'}'。 –