嗯,这不是最好的情况说明...无论如何,我试图更新我的视图模型,但它不工作。默认情况下,我从控制器功能,并通过点击按钮获取数据 - 从同位指示其他功能,但视图模型只包含第一视图模型初始化后接收到的数据。Knockout.js更新视图模型上的按钮点击
<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>
UPDATE。 我chaged的代码块中我得到新数据如下:
self.request = function (uri) {
$.getJSON(uri, function (data) {
ko.mapping.fromJS(data.$values, {}, viewModel);
});
}
不幸的是这是行不通的为好。这里没有任何JS错误,控制器返回更新数据的适当部分。
您确定没有JavaScript错误,并且您的请求调用成功处理程序吗? – milagvoniduak
经过一番调查,我认为这一行的问题 - ko.mapping.fromJS(data。$ values,{},viewModel);因为当我尝试通过alert(data。$ values)显示数据时,它显示的是Object而不是数据。是的,为了避免再次调用viewmodel,我使用clickeevnt作为@GoTo的建议。 –