在ajax搜索结果返回后初始化viewmodel并刷新
问题描述:
如何在第一次加载页面时初始化viewModel?在ajax搜索结果返回后初始化viewmodel并刷新
Ajax调用的刷新工作并在ajax调用后正确加载数据,但是在第一次加载时页面不知道模型。
var viewModel = {};
$("#searchButton").click(function() {
var tc= $("#tc").val();
var y= $("#y").val();
$.ajax({
url: "Search/?t=" + tc+ "&y=" + y,
type:'GET',
dataType: 'json',
success: function (result) {
viewModel = new TourViewModel(result);
ko.applyBindings(viewModel);
}
});
});
function TourViewModel(data) {
var self = this;
var tourMapping = {};
self.selectedItem = ko.observable("");
self.lastSavedJson = ko.observable("");
self.saveMe = function() {
viewModel.selectedItem(this);
self.lastSavedJson(JSON.stringify(ko.toJS(self.selectedItem), null, 2));
$.ajax({
url: "SaveTour",
data: ko.toJSON({ tour:ko.toJS(self.selectedItem) }),
type: "post",
contentType: "application/json",
success: function (result)
{ alert(result) }
});
}
selectItem = function() {
self.selectedItem(this);
}
ko.mapping.fromJS(data, tourMapping, self);
};
答
这是一个相当基本的例子。做你的ajax调用,然后使用结果初始化模型。
var ViewModel = function(r) {
var self = this;
this.Beers = ko.observableArray(r.map(function(beer) {
return new BeersModel(beer);
}));
this.RefreshBeer = function() {
self.Beers([]);
GetBeer()
.then(function(response) {
self.Beers(response.map(function(beer) {
return new BeersModel(beer);
}))
});
}
}
var BeersModel = function(r) {
this.name = r.name;
}
var GetBeer = function() {
return $.ajax({
url: 'https://api.punkapi.com/v2/beers',
method: 'GET'
})
}
// Do init ajax stuff, and load viewModel
GetBeer()
.then(function(response) {
var model = new ViewModel(response);
ko.applyBindings(model);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<button data-bind="click: RefreshBeer">Refresh Beer</button>
<!-- ko if: Beers() -->
<ul>
<!-- ko foreach: Beers -->
<li>
<span data-bind="text: name"></span>
</li>
<!-- /ko -->
</ul>
<!-- /ko -->
感谢。尽管如何让它在页面加载时不显示任何结果,并且只需点击refreshbeer就可以显示?我的页面在页面加载时不会有任何结果,但点击“搜索”结果将被加载,但是如果我在ajax调用返回中绑定,那么在此之前视图并不知道视图模型 – user8808262
那么,你做我所做的和在执行.then()方法的内容之前使用GetBeer()。then()等待ajax方法的结果。这样你就知道你有数据,并在那之后实例化viewModel。如果数据 - >可能需要html条件,如 Budhead2004
谢谢你的帮助。这有帮助。 – user8808262