2012-07-12 3 views
1

Я собираюсь в конечном итоге с несколькими 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; 
} 
+2

Вы действительно не должны 'applyBindings' внутри такой функции. примените один раз, затем нажмите изменения в своей модели просмотра. Связывание обновит представление. – Tyrsius

+0

Я не уверен, что понимаю, что вы имеете в виду. – mistyayn

+0

Вызов 'ko.applyBindings()' должен выполняться только один раз *. Как только привязки будут применены, любой HTML с привязкой данных будет обновляться при обновлении viewmodel. Если это все еще не имеет смысла, подумайте о том, чтобы пройти учебники по нокауту. – Tyrsius

ответ

0

Вы проходя viewModel1 в GetAnswersAndComments. Внутри функции у вас есть местная копия ссылки на viewModel1, и эта локальная копия называется currentViewModel.

Затем вы устанавливаете эту локальную переменную currentViewModel = ko.mapping.toJS(result);. Это не касается viewModel1 и поэтому остается неопределенным. Базовый Javascript