我在使用不绑定(bind)订阅更新的 knockout 模型时遇到问题。我有一个 C# MVC 页面,它向模板提供一个模型,该模板被解析为 Json 并作为 ko.applyBindings
的 ViewModel 分配的一部分原始提供。我订阅了一个可观察对象,它调用一个方法来执行 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);;
});
};
当我执行日志记录时,我可以看到所有数据,而且看起来都是正确的。使用相同的方法来生成初始模型和更新后的模型。我在其他页面上使用过这种技术,每次都完美无缺。然而,在这种情况下,我正在寻找它来绑定(bind)/更新 SomeComplexArray
,而这并没有发生。如果我尝试手动执行此操作,则我无法在数组上获得正确的绑定(bind),我会得到空白。我想知道是否有明显我做错了的事情,而我却完全错过了。
编辑:我不知道可以将 ko.mapping 指向罪魁祸首。标准模型更改也不会影响界面。这在某种意义上是行不通的。我有一个可见绑定(bind)到数组长度的 p 元素和一个单击绑定(bind)到从 SomeComplexArray 弹出项目的函数的 div 元素。我可以在控制台日志中看到它正在执行其功能(随后的点击导致“未定义”不具有该功能)。但是,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: 来自@Matt Burland 的评论,我已经修改了 pop 的调用方式,现在手动方法可以动态修改元素。然而,ko.mapping 仍然没有像我预期的那样运行。在测试中,我在调用 ko.mapping 之前和之后做了一个特定行的 console.log。未对 observableArray 进行任何更改。
最佳答案
我在 JSFiddle 中创建了你的 knockout 情况测试.
您必须在不带括号的情况下调用您的数组函数。我测试了这部分:
self.UpdateArray = function () {
self.SomeComplexArray.pop();
};
它似乎在 JSFiddle 端工作。
关于asp.net-mvc - knockout 映射没有更新我的模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24893212/