Во-первых, ваша скрипка использует действительно устаревшую версию нокаута ( 1.2.1 древний). Я обновил его до 3.2.0. Также вам не нужен плагин шаблона jQuery для чего-либо. Я удалил его.
Далее, я бы порекомендовал построить ваши модели представления таким образом, чтобы они сами о себе заботились, включая загрузку из данных инициализации. Вот так:
// Contained Model
function SearchResultModel(init) {
// data
this.message = ko.observable();
this.cod = ko.observable();
this.city_id = ko.observable();
this.calctime = ko.observable();
this.cnt = ko.observable();
this.list = ko.observableArray();
// init
ko.mapping.fromJS(init, {}, this);
}
Затем вы можете немного сократить свой Ajax-запрос:
// View Model
function WeatherViewModel(init) {
var self = this;
// data
self.city = ko.observable();
self.searchResult = ko.observable(new SearchResultModel());
// methods
self.getWeatherByCity = function () {
var city = self.city()
if (city) {
$.get('http://api.openweathermap.org/data/2.5/history/city', {
q: city
}).done(function(data) {
self.searchResult(new SearchResultModel(data));
}).fail(function () {
alert("could not get weather data!");
});
} else {
// no city? => empty the search result
self.searchResult(new SearchResultModel());
}
};
// init
ko.mapping.fromJS(init, {}, self);
}
init с примерами данных:
ko.applyBindings(new WeatherViewModel({
city: "Vancouver, CA"
}));
и все готово: http://jsfiddle.net/ENMGp/539/.
Поскольку вы отметили это [knockout-2.0] (я понятия не имею, зачем вам это нужно для нового проекта), я создал версию, совместимую с 2.0: http://jsfiddle.net/ENMGp/540/. Код тот же, но нокаут 2.0 не работает с jQuery 1.9+, поэтому мне пришлось понизить обе библиотеки. FWIW, я бы рекомендовал использовать текущую версию нокаута.
person
Tomalak
schedule
30.01.2015