2012-06-04 3 views
2

В настоящее время я успешно использую knockout.js для обработки всей моей привязки данных в своем приложении. Однако при каждой загрузке страницы, в моем document.ready я делаю первоначальный asnychronous загрузки данных, как это:knockout.js load form in viewModel

$(document).ready() { 
    getData() 
}); 

Однако, можно ли вместо этого, загрузить данные в форму (с помощью ASP.NET MVC2), а затем обратную загрузку данных в модель просмотра на основе тегов привязки данных?

Я чувствую, что это не работает, я просто хочу подтвердить, что я ничего не делаю неправильно.

ответ

3

Связывание «значение» первоначально устанавливает значение элемента в том, что находится в вашей модели просмотра, поэтому нет. Тем не менее, вы, вероятно, могли бы дублировать код для привязки «значение» в своем собственном обработчике, который первоначально задавал значения модели из значений элементов управления. Скачать debug version нокатирующим, и искать ko.bindingHandlers['value'] = { на линии 2182. Копия этого заявления обязательного обработчика и изменения «значение» на что-то другое, а затем добавить вызов valueUpdateHandler() в конце INIT:

ko.bindingHandlers['myvalue'] = { 
    'init': function (element, valueAccessor, allBindingsAccessor) { 
     // skipping code 
     valueUpdateHandler(); // update model with control values 
    }, 
    'update': function (element, valueAccessor) { 
     // skipping code 
    } 
}; 

сейчас при использовании связывания MyValue, ваша модель будет обновляться с контрольными значениями, когда первоначально связаны:

<input type="text" data-bind="myvalue: name"></input> 

в качестве альтернативы можно было бы назвать исходные значения вместо копирования весь код, а просто добавить код из valueUpdateHandler после init:

ko.bindingHandlers['myvalue'] = { 
    'init': function (element, valueAccessor, allBindingsAccessor) { 
     // call existing value init code 
     ko.bindingHandlers['value'].init(element, valueAccessor, allBindingsAccessor); 

     // valueUpdateHandler() code 
     var modelValue = valueAccessor(); 
     var elementValue = ko.selectExtensions.readValue(element); 
     ko.jsonExpressionRewriting.writeValueToProperty(modelValue, allBindingsAccessor, 'value', elementValue, /* checkIfDifferent: */ true); 
    }, 
    'update': function (element, valueAccessor) { 
     // call existing value update code 
     ko.bindingHandlers['value'].update(element, valueAccessor); 
    } 
}; 

Если вы не хотите использовать AJAX, вы всегда можете получить значение в JavaScript с помощью сериализации модели как JSON (синтаксис бритвы):

<script type="text/javascript"> 
var model = @(new HtmlString(new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(Model))); 
</script> 
+0

последняя часть была точный ответ я искал. Это отлично. Конечно, немного стыдно включать это в мой прямой файл aspx, а затем ссылаться на него из внешнего JS-файла, но, тем не менее, это то, что я искал. Благодаря! –

Смежные вопросы