Я собираюсь в конечном итоге с несколькими viewModels на одной странице, поэтому я пытаюсь выяснить, как передать viewModel как переменную функции, чтобы выполнять мои вызовы ajax. Я пытаюсь обновить этот промежуток:KnockoutJS pass viewModel to function
<span data-bind="text: AnswerText"/></span> <span data-bind="text: GetFormattedDate() "/></span>
Этот кусок кода работает и правильно заполнит со значением от GetFormattedDate:
var viewModel1;
$(document).ready(function() {
var jsonDataToSend = { questionConfigurationID: 1 };
$.ajax({
url: "SomePage.aspx/GetAnswerAndComments",
type: "post",
dataType: "text json",
contentType: "application/json; charset=utf-8",
data: JSON.stringify(jsonDataToSend),
success: function (msg) {
var result = msg.d;
if (result != null) {
viewModel1 = ko.mapping.toJS(result);
ko.applyBindings(viewModel1, document.getElementById("divAnswerAndComment1"));
}
}
});
});
function GetFormattedDate()
{
var date = "";
if (viewModel1.InsertDate != null)
{
date = new Date(parseInt(viewModel1.InsertDate.substr(6)))
}
return date;
}
Но когда я заменил функцию $ document.ready с вызовом к другой функции, передающей viewModel как переменную, когда GetFormattedDate называется viewModel1, не определен (см. ниже). Я уверен, что это имеет какое-то отношение к сфере применения viewModel1, но я не могу точно определить, в чем проблема.
var viewModel1;
$(document).ready(function() {
GetAnswersAndComments(1, viewModel1);
});
function GetAnswersAndComments(questionID, currentViewModel) {
var jsonDataToSend = { questionConfigurationID: questionID };
$.ajax({
url: "ControlWebMethods.aspx/GetAnswerAndComments",
type: "post",
dataType: "text json",
contentType: "application/json; charset=utf-8",
data: JSON.stringify(jsonDataToSend),
success: function (msg) {
var result = msg.d;
if (result != null) {
currentViewModel = ko.mapping.toJS(result);
ko.applyBindings(currentViewModel);
}
}
});
}
function GetFormattedDate()
{
var date = "";
if (viewModel1.InsertDate != null)
{
date = new Date(parseInt(viewModel1.InsertDate.substr(6)))
}
return date;
}
Вы действительно не должны 'applyBindings' внутри такой функции. примените один раз, затем нажмите изменения в своей модели просмотра. Связывание обновит представление. – Tyrsius
Я не уверен, что понимаю, что вы имеете в виду. – mistyayn
Вызов 'ko.applyBindings()' должен выполняться только один раз *. Как только привязки будут применены, любой HTML с привязкой данных будет обновляться при обновлении viewmodel. Если это все еще не имеет смысла, подумайте о том, чтобы пройти учебники по нокауту. – Tyrsius