Я работаю над проектом, для которого требуются Asp.Net WebForms (это миграция огромного сайта .net 2.0 без времени на повторную реализацию в MVC) и веб-службы asmx. Когда запрашивается страница, она отправляется сервером и работает как SPA. Через некоторое время мы понимаем, что нам нужна модель за javascript, чтобы избежать кошмарного кода. Мы пробовали Knockout.js, пока не столкнулись с проблемой, которую не смогли решить: повторное использование кода с пользовательскими элементами управления и моделями представлений Knockout.js. Наши пользовательские элементы управления имеют модели представления, которые создаются при объединении нескольких пользовательских элементов управления на странице. Нокаут просто не работает. Я знаю, что, возможно, веб-формы не являются типичным стеком при создании веб-приложений SPA, но что ж... требования есть требования... чем помочь?
MV* Framework для ASP.Net WebForms — повторное использование кода
Ответы (1)
Что бы я сделал в вашем сценарии (потому что я делал это сам в прошлом):
Имейте глобальный объект ViewModel, скажем:
var _ViewModel = {}
Для каждого из ваших элементов управления есть функция, которая настраивает эту часть ViewModel, т.е. (это входит в .ascx и указывает на функцию файла JS)
<script language="javascript">
var _ViewModel // this should be in a global.js file or something.
SetupThisViewModel()
ko.applyBindings(_ViewModel);
</script>
и в JS-файле:
// Used for user control 1
function SetupThisViewModel()
{
_ViewModel.testItem = ko.observable('');
}
// Used for user control 2
function SetupThisViewModel2()
{
_ViewModel.testItem2 = ko.observable('');
}
А если вам нужны два пользовательских элемента управления на одной странице, просто выполните:
<script language="javascript">
var _ViewModel // this should be in a global.js file or something.
SetupThisViewModel();
SetupThisViewModel2();
ko.applyBindings(_ViewModel);
</script>
Это будет работать для вашего сценария.
person
Chris Dixon
schedule
18.02.2013
ko.applyBindings(viewModel, document.getElementById("DIVwrapperaroundusercontrolmarkup"));
- person Brian Mains   schedule 18.02.2013