2013-01-18 26 views
23

Là một phần của quan điểm của tôi, tôi có:Làm thế nào để chạy mã sau Knockout JS đã cập nhật DOM

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

Tôi muốn chạy một số mã 3rd Party lần loại trực tiếp đã được cập nhật DOM.

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

Bất kỳ ý tưởng nào về cách tôi có thể móc vào loại trực tiếp để gọi điều này vào đúng thời điểm?

+0

Chính xác bạn muốn thay đổi điều gì? Các thuộc tính này đã có mặt trên caseStudies chưa? – thomaux

+0

Tôi không muốn thay đổi bất cứ điều gì tôi cần một thư viện của bên thứ ba để đính kèm các sự kiện để các liên kết. – Magpie

+0

Bạn có thể cung cấp cho chúng tôi một Fiddle không? – thomaux

Trả lời

28

Sử dụng afterRender ràng buộc có thể giúp bạn.

<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

Chúc mừng, đó là những gì tôi đang tìm kiếm – Magpie

+0

Làm thế nào để làm điều đó nếu tôi đã sử dụng một cái gì đó khác hơn là 'foreach', như 'tùy chọn'? – AbdelHady

+1

@AbdelHady Bạn có thể sử dụng callback optionsAfterRender: http://knockoutjs.com/documentation/options-binding.html – KodeKreachor

12

Một cách chính xác là sử dụng thực tế là KnockoutJS áp dụng bindings tuần tự (như họ được thể hiện trong html). Bạn cần xác định một phần tử ảo sau phần tử 'foreach-bound' và định nghĩa ràng buộc 'text' để gọi hàm bên thứ ba của bạn.

Dưới đây là html:

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

Đây là mã:

$(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); 
    } 
+0

afterRender đã gây ra các trình kích hoạt sự kiện trùng lặp và cách tiếp cận này hoạt động tốt cho tôi. – misha

+0

Dude !! đó chỉ là tuyệt vời .. Cảm ơn rất nhiều cho việc chia sẻ – pravin

Các vấn đề liên quan