Как запустить код после нокаута JS обновил DOM - программирование
Подтвердить что ты не робот

Как запустить код после нокаута JS обновил DOM

Как часть моего представления у меня есть:

<ul data-bind="foreach: caseStudies">
    <li><a data-bind="text: title, attr: { href: caseStudyUrl }"></a></li>
</ul>

Я хочу запустить некоторый код третьей стороны, как только нокаут обновил DOM.

caseStudies(data);
thirdPartyFuncToDoStuffToCaseStudyLinks(); <-- DOM not updated at this point.

Любая идея о том, как я могу подключиться к нокауту, чтобы называть это в нужное время?

4b9b3361

Ответ 1

Использование привязки afterRender может помочь вам.

<ul data-bind="foreach: { data:caseStudies, afterRender:checkToRunThirdPartyFunction }">
    <li><a data-bind="text: title, attr: { href: caseStudyUrl }"></a></li>
</ul>


function checkToRunThirdPartyFunction(element, caseStudy) {
    if(caseStudies.indexOf(caseStudy) == caseStudies().length - 1){
        thirdPartyFuncToDoStuffToCaseStudyLinks();
    }
}

Ответ 2

Одним из точных способов является использование того факта, что KnockoutJS последовательно применяет привязки (поскольку они представлены в html). Вам нужно определить виртуальный элемент после элемента 'foreach-bound' и определить привязку 'text', которая вызывает вашу стороннюю функцию.

Вот html:

<ul data-bind="foreach: items">
    <li data-bind="text: text"></li>
</ul>
<!-- ko text: ThirdParyFunction () -->
<!-- /ko -->

Вот код:

    $(function () {
        var data = [{ id: 1, text: 'one' }, { id: 2, text: 'two' }, { id: 3, text: 'three' } ];

        function ViewModel(data) {
            var self = this;
            this.items = ko.observableArray(data);
        }

        vm = new ViewModel(data);
        ko.applyBindings(vm);
    });

    function ThirdParyFunction() {
        console.log('third party function gets called');
        console.log($('li').length);
    }