knockout.js完成呈现所有元素后成功回调

roh*_*ora 47 foreach jquery knockout.js

我实现了一个淘汰赛的foreach结合,在同一个页面多个模板,范例之一,这里给出的,我感兴趣是找出当块呈现完毕后,我曾尝试afterRenderafterAdd,但我想它运行的每个元素,而不是整个循环结束后.

<ul data-bind="foreach: {data: Contacts, afterAdd: myPostProcessingLogic}">
  <li>
    <div class="list_container gray_bg mrgT3px">
      <div class="list_contact_icon"></div>
      <div class="contact_name"><span data-bind="text: first_name"></span> <span data-bind="text: last_name"></span></div>
      <div class="contact_number"><span data-bind="text: value"></span></div>
      <div class="callsms_container">
        <a href="#notification-box" class="notifcation-window">
          <div class="hover_btn tooltip_call">
            <div class="hover_call_icon"></div>
            <span>Call</span></div>
        </a>
        <a class="sendsms" href="#sendsms" rel="#sendsms">
          <div class="hover_btn tooltip_sms">
            <div class="hover_sms_icon"></div>
            <span>SMS</span></div>
        </a>
        <a href="#">
          <div class="hover_more_btn"></div>
        </a>
      </div>
      <!-- close callsms container -->
      <div id="notification-box" class="notification-popup">
        <a href="#" class="close"><img class="btn_close" src="images/box_cross.png" /></a> <img class="centeralign" src="images/notification_call.png" /> <span>Calling... +44 7401 287366</span> </div>
      <!-- close notification box -->
      <!-- close list gray bg -->
      <div class="tooltip_description" style="display:none" id="disp"> asdsadaasdsad </div>
    </div>
  </li>
</ul>
Run Code Online (Sandbox Code Playgroud)

当循环完成渲染时,我感兴趣的是找出成功回调.

这是我的afterAdd函数,它基本上附加了一些jQuery事件,并没有什么.

myPostProcessingLogic = function(elements) { 
  $(function(){
      $(".list_container_callog").hover(function(){  
          $(".callsms_container", this).stop().animate({left:"0px"},{queue:false,duration:800});
      }, function() {
          $(".callsms_container", this).stop().animate({left:"-98%"},{queue:false,duration:800});
      });
  });
}
Run Code Online (Sandbox Code Playgroud)

在此先感谢,并告诉我有一个成功的回调:)

Kon*_*nev 66

你有afterRender回调knockout.js:

foreach: { data: myItems, afterRender: renderedHandler }
Run Code Online (Sandbox Code Playgroud)

这是文档.

在处理程序内部检查呈现的集合的长度是否等于items集合的长度.如果不是,则不执行您打算使用的完整渲染逻辑.

renderedHandler: function (elements, data) {
    if ($('#containerId').children().length === this.myItems().length) {
        // Only now execute handler
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 有一个额外的内部foreach淘汰似乎首先绑定外环,这破坏了这种方法...是否有另一种方法来处理foreach及其内部的一切并在此之后执行一个函数? (3认同)
  • 我已经用过了.问题是它在每个元素渲染后回调,而我有兴趣找出所有元素何时完成渲染 (2认同)

Chu*_*der 11

尝试包裹ul

<div data-bind='template: {afterRender: myPostProcessingLogic }'>
Run Code Online (Sandbox Code Playgroud)

它只会在第一次渲染模板中的所有内容时起作用.但是你只能调用myPostProcessingLogic.这是一个小提琴

<div data-bind='template: {afterRender: myPostProcessingLogic }'>
  <ul data-bind="foreach: Contacts">
    <li>
      <div class="list_container gray_bg mrgT3px">
        <div class="list_contact_icon"></div>
        <div class="contact_name"><span data-bind="text: first_name"></span> <span data-bind="text: last_name"></span></div>
        <div class="contact_number"><span data-bind="text: value"></span></div>
        <div class="callsms_container">
          <a href="#notification-box" class="notifcation-window">
            <div class="hover_btn tooltip_call">
              <div class="hover_call_icon"></div>
              <span>Call</span></div>
          </a>
          <a class="sendsms" href="#sendsms" rel="#sendsms">
            <div class="hover_btn tooltip_sms">
              <div class="hover_sms_icon"></div>
              <span>SMS</span></div>
          </a>
          <a href="#">
            <div class="hover_more_btn"></div>
          </a>
        </div>
        <!-- close callsms container -->
        <div id="notification-box" class="notification-popup">
          <a href="#" class="close"><img class="btn_close" src="images/box_cross.png" /></a> <img class="centeralign" src="images/notification_call.png" /> <span>Calling... +44 7401 287366</span> </div>
        <!-- close notification box -->
        <!-- close list gray bg -->
        <div class="tooltip_description" style="display:none" id="disp"> asdsadaasdsad </div>
      </div>
    </li>
  </ul>
</div>
Run Code Online (Sandbox Code Playgroud)


Que*_*Dee 5

Chuck Schneider 上面的回答是最好的。我不得不使用无容器控件,因为 foreach 位于 tbody 元素上:

<!-- ko template: {afterRender: SetupCheckboxes } -->
<tbody data-bind="foreach: selectedItems" id="gridBody">
  <tr>
    <td>
      <input type="checkbox" />
    </td>
  </tr>
</tbody>
<!-- /ko -->
Run Code Online (Sandbox Code Playgroud)