Лучший способ отследить начальное отображение, используя KnockoutJs - PullRequest
2 голосов
/ 09 ноября 2011

Я обнаружил, что в моем приложении многократно повторяется следующий шаблон (см. Код ниже).Мне нужно вызвать BindMyEvents (true) для первой загрузки, а затем BindMyEvents (false) для последующего извлечения данных.

Он загружается лениво, поэтому я не хочу, чтобы данные сериализовались в исходный код HTML.Есть ли лучший способ, чем передавать логический флаг в метод Bind ()?Существует ли стандартная схема достижения этого с нокаутом?

Я подумал, нужно ли просто установить viewAlertsModel.alerts = null внутри определения модели представления, а затем позволить функции Bind проверить это.Если установлено значение null, тогда вызвать метод отображения, а затем applyBindings ()?

function BindMyEvents(initialMap) {
   // get alerts, map them to UI, then run colorbox on each alert        
        $.getJSON("/Calendar/MyEvents/", {},
            function (data) {

                if ( initialMap ) {
                    // set-up mapping
                    viewAlertsModel.alerts = ko.mapping.fromJS(data);
                    ko.applyBindings(viewAlertsModel,$("#alertedEventsContainer")[0]);     

                } else {
                    // update
                    ko.mapping.fromJS(data, viewAlertsModel.alerts);
                }

            }); 
}

1 Ответ

0 голосов
/ 10 ноября 2011

Я бы перестроил ваш код для другого потока.

первый - определите ваши данные один раз.

viewAlertsModel.alerts = ko.observable();

Во-вторых, свяжите свои данные

ko.applyBindings(viewAlertsModel,$("#alertedEventsContainer")[0]);

В-третьих, теперь работайте со своими данными

 $.getJSON("/Calendar/MyEvents/", {},
        function (data) {
                ko.mapping.fromJS(data, viewAlertsModel.alerts);
         });

Шаги 1 и 2 можно выполнить на этапе инициализации. Ключ здесь сначала определяется viewAlertsModel.alerts как наблюдаемый.

Шаг третий - ваш код времени выполнения. Теперь ваш код инициализации полностью отделен от кода времени выполнения. Это более нормальный стиль нокаута.

редактировать

Что касается ваших комментариев об использовании ko-mapping, я использую следующий код

var tempVar = ko.mapping.fromJS(data);
viewAlertsModel.alerts(tempVar);  // !important - do not use = operator.

Это соглашение, которым пользуется большинство людей. Ваше использование ko-mapping обычно используется для специализированных ситуаций.

...