【发布时间】:2014-06-11 04:23:56
【问题描述】:
嗯,这不是最好的情况描述......无论如何,我正在尝试更新我的 ViewModel 但它不起作用。默认情况下,我从控制器函数获取数据并通过按钮单击 - 从同一控制器中的另一个函数获取数据,但 ViewModel 仅包含第一次 ViewModel 初始化后收到的数据。
<script>
function viewModel () {
var self = this;
self.currentPage = ko.observable();
self.pageSize = ko.observable(10);
self.currentPageIndex = ko.observable(0);
self.salesdata = ko.observableArray();
self.newdata = ko.observable();
self.currentPage = ko.computed(function () {
var pagesize = parseInt(self.pageSize(), 10),
startIndex = pagesize * self.currentPageIndex(),
endIndex = startIndex + pagesize;
return self.salesdata.slice(startIndex, endIndex);
});
self.nextPage = function () {
if (((self.currentPageIndex() + 1) * self.pageSize()) < self.salesdata().length) {
self.currentPageIndex(self.currentPageIndex() + 1);
}
else {
self.currentPageIndex(0);
}
}
self.previousPage = function () {
if (self.currentPageIndex() > 0) {
self.currentPageIndex(self.currentPageIndex() - 1);
}
else {
self.currentPageIndex((Math.ceil(self.salesdata().length / self.pageSize())) - 1);
}
}
//Here I'm trying to update ViewModel
self.request = function (uri) {
$.ajax({
url: uri,
contentType: 'application/json',
data: [],
type: 'GET',
cache: false,
success: function (data) {
ko.mapping.fromJS(data.$values, {}, self.salesdata);
}
});
}
}
$(document).ready(function () {
$.ajax({
url: "/api/sales",
type: "GET",
cache: false,
}).done(function (data) {
var vm = new viewModel();
vm.salesdata(data.$values);
ko.applyBindings(vm);
}).error(function (xhr, status, error) {
var err = eval("(" + xhr.responseText + ")");
alert(err.Message);
});
//Here i'm calling for ViewModel update
$(".btn-default").click(function () {
days = $(this).val();
var uri = "/api/sales?days=" + days;
new viewModel().request(uri);
});
});
</script>
更新。 我将获取新数据的代码块更改如下:
self.request = function (uri) {
$.getJSON(uri, function (data) {
ko.mapping.fromJS(data.$values, {}, viewModel);
});
}
不幸的是,这也不起作用。这里没有任何 JS 错误,控制器返回更新数据的适当部分。
【问题讨论】:
-
您确定没有 JavaScript 错误并且您的请求调用了成功处理程序吗?
-
经过一番调查,我认为这一行存在问题 - ko.mapping.fromJS(data.$values, {}, viewModel);因为当我尝试通过警报(data.$values)显示数据时,它显示的是对象而不是数据。是的,为了避免再次调用 viewmodel,我使用 clickeevnt 作为@GoTo 的建议。
标签: javascript jquery mvvm knockout.js