Событие Knockout JS для любого обновления модели viewmodel dom - PullRequest
8 голосов
/ 08 февраля 2012

Мне нужно запускать бит кода jquery ui всякий раз, когда DOM обновляется через Knockout.JS.Я понимаю, что это можно сделать с помощью пользовательских привязок, но, похоже, это связано с конкретной моделью представления, я хочу сделать это глобально, поэтому, когда бы это ни происходило на любой модели представления, она запускается?

Допустим, я ВСЕГДА хочу использовать средство выбора даты JQuery для всех текстовых полей с классом 'needsdate', вместо того чтобы добавлять это в каждую из моих моделей представлений, было бы здорово, если бы я мог сделать это глобально.

Возможно ли это?

Ответы [ 2 ]

7 голосов
/ 08 февраля 2012

Если вы не собираетесь динамически добавлять / удалять элементы, то вы можете просто подключить их как обычно. Однако, если вы работаете с динамическим контентом (например, с использованием observableArray, в котором изменяются его элементы), у вас есть несколько вариантов:

1- Как и ответ здесь , вы можете создать собственную привязку. Если вы не хотите связывать значение со свойством в вашей модели представления, то вы можете упростить привязку к чему-то вроде:

ko.bindingHandlers.datepicker = {
    init: function(element, valueAccessor) {
        //initialize datepicker with some optional options
        var options = ko.utils.unwrapObservable(valueAccessor());
        $(element).datepicker(options);

        //handle disposal (if KO removes by the template binding)
        ko.utils.domNodeDisposal.addDisposeCallback(element, function() {
            $(element).datepicker("destroy");
        });
    }
}; 

Вы бы поместили его на элемент вроде:

<input data-bind="datepicker: { minDate: new Date() }" />

2 - другой вариант - использовать afterRender функциональность из templateforeach, которая использует template), чтобы соединить ваши средства выбора даты после рендеринга нового контента.

0 голосов
/ 11 июня 2013

Я создал функцию refreshJQuery(), которая применяет все мои сложные действия за один раз. Затем я вызываю эту функцию, когда подписываюсь на наблюдаемые в моей модели представления, чтобы обновить мою модель. И один раз на странице загрузки.

function refreshJQuery() {
    $(".draggable, .droppable, .resizable").each(function () {

        var $element = $(this);

        if ($element.hasClass("draggable") && !$element.data("init-draggable")) {
            $element.data("init-draggable", true).draggable(dragBehavior);
        }
        if ($element.hasClass("droppable") && !$element.data("init-droppable")) {
            $element.data("init-droppable", true).droppable(dropBehavior);
        }
        if ($element.hasClass("resizable") && !$element.data("init-resizable")) {
            $element.data("init-resizable", true).resizable(resizeBehavior);
            $(this).children().fadeTo(2000, 0);
            $element.hover(function () {
                $(this).children().fadeTo(200, 1);
            },
            function () {
                $(this).children().fadeTo(750, 0);
            });
        }
    });
};

Затем я использую его следующим образом, хотя я определил 2 других наблюдаемых, из которых мне нужно также вызвать эту функцию:

this.updateTime = function () {
    service.updateBookingTimes(this.id(), this.startDate(), this.endDate());
    refreshJQuery();
};

this.startDate.subscribe(this.updateTime, this);
this.endDate.subscribe(this.updateTime, this);

Я также реализовал решение @ RPNiemeyer для подписок JQuery на уровне поля, поэтому в дополнение к его примеру для средства выбора даты у меня есть аналогичный код, который повторно применяет теги $.button() к <a> и другой, который преобразует флажки в переключатели стиля iPhone. .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...