MV* Framework для ASP.Net WebForms — повторное использование кода

Я работаю над проектом, для которого требуются Asp.Net WebForms (это миграция огромного сайта .net 2.0 без времени на повторную реализацию в MVC) и веб-службы asmx. Когда запрашивается страница, она отправляется сервером и работает как SPA. Через некоторое время мы понимаем, что нам нужна модель за javascript, чтобы избежать кошмарного кода. Мы пробовали Knockout.js, пока не столкнулись с проблемой, которую не смогли решить: повторное использование кода с пользовательскими элементами управления и моделями представлений Knockout.js. Наши пользовательские элементы управления имеют модели представления, которые создаются при объединении нескольких пользовательских элементов управления на странице. Нокаут просто не работает. Я знаю, что, возможно, веб-формы не являются типичным стеком при создании веб-приложений SPA, но что ж... требования есть требования... чем помочь?


person Juan    schedule 18.02.2013    source источник
comment
Когда вы применяете модель просмотра к странице, вы можете применить модель представления нокаута только к части страницы, выполнив ko.applyBindings(viewModel, document.getElementById("DIVwrapperaroundusercontrolmarkup"));   -  person Brian Mains    schedule 18.02.2013


Ответы (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