如何在angular中把DOM加载完成后再调用指定函数

本文探讨了如何解决Angular框架中使用Select2插件时遇到的显示问题,特别是在ng-repeat循环内的元素上应用Select2时的挑战。通过自定义Angular指令实现Select2的正确初始化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

下面是个网页片段,

 <tbody ng-repeat="row in convertdisplayed|filter:filter |paging:page.index:page.size"
                       on-finish-render="ngRepeatFinished">
                <tr>
                    <td align="left">
                 <span editable-textarea="row.turntest_name" e-name="turntest_name" e-form="rowform"
                       onbeforesave="checkName($data, row.turntest_id)">
          {{row.turntest_name}}
        </span>

                    </td>
                    <td align="left">

                        <span> {{row.profile}} </span>
                    </td>
                    <td align="left">
                 <span editable-text="row.updated" e-name="updated" e-form="rowform"
                       onbeforesave="checkName($data, row.turntest_id)">
         {{ row.updated | date:'yyyy-MM-dd HH:mm:ss'}}
        </span>
                    </td>
                    <td align="left">
                <span ng-if="!rowform.$visible">
                    {{row.baseline}}
                 </span>
                      
                        <div ng-show="rowform.$visible">
                            <select ng-model="row.baseline" id="mySelect"
                                    class="js-example-basic-single form-control"
                                    ng-options="baseline for baseline in baselines "
                                    style="height: 100px;width: 50%">
                                <option value="">请选择基线</option>
                            </select>
                           <!--上面这个select用了一个angular的指令,select2--->     
                        </div>


                    </td>
                    <!--<td align="left">-->
                    <!--<span editable-text="row.turntask" e-name="turntask" e-form="rowform"-->
                    <!--onbeforesave="checkName($data, row.turntest_id)">-->
                    <!--{{row.turntask}}-->
                    <!--</span>-->


                    <td align="left">
                 <span editable-textarea="row.explain" e-name="explain" e-form="rowform"
                       e-rows="3" e-cols="10" onbeforesave="checkName($data, row.turntest_id)">
                     <span class="font-wrap">{{row.explain}}</span>
        </span>

                    </td>
                    <td align="left" class="{{ row.status }}">
                        <a ng-if="row.edit" class="name"
                           ui-sref="app.configconvert({id:'{{ work_team_id }}',convertId:'{{row.turntest_id}}',testtype:'{{type}}'})"
                           style="color: #4A75A0;font-size: 14px;font-family: MicrosoftYaHei">配置  </a>
                        <a class="name" ng-click="showTable(row)"
                           style="color: #4A75A0;font-size: 14px;font-family: MicrosoftYaHei">查看  </a>
                        <a class="name" ng-click="deleteRow(row)"
                           style="color: #4A75A0;font-size: 14px;font-family: MicrosoftYaHei"
                        >删除  </a>
                        <a ng-if="row.edit" ng-show="!rowform.$visible" class="name"
                           ng-click="rowform.$show();defaultItem(row)"
                           style="color: #4A75A0;font-size: 14px;font-family: MicrosoftYaHei">修改  </a>
                        <form editable-form name="rowform"
                              onbeforesave="saveItem($data, row,rowform)"
                              ng-show="rowform.$visible" class="form-buttons form-inline"
                              shown="inserted == row">
                            <button type="submit" ng-disabled="rowform.$waiting" title="保存"
                                    class="btn btn-sm btn-default ">
                                <em class="fa fa-save"></em>
                            </button>
                            <button type="button" ng-disabled="rowform.$waiting"
                                    ng-click="rowform.$cancel();resetDefault(row)"
                                    title="取消" class="btn btn-sm btn-default">
                                <em class="fa fa-times"></em>
                            </button>
                        </form>


                    </td>

                </tr>
           
                </tbody>

因为用到了angular的select2这个插件(指令),select2用在了ng-repeat内部,select2的效果没有显示出来,所以需要再DOM加载完成后调用初始化函数,才能正常显示。

于是,我在Html页面头部加载了下面的代码:

<script type="text/javascript">
    $(document).ready(function () {
       $(".js-example-basic-single").select2();
      });
   
</script>

加上了上面这段代码后,select2的效果还是没有显示出来,这个标签放在了ng-repeat的外面的话,就可以正常加载插件的效果,所以,我猜想应该是初始化函数的问题。

于是,百度了一下,有大神指出需要用在ng-repeat 结束以后触发初始化函数。找到了原因,参考大神的方法,解决方法如下:

先定义指令:

app.directive('onFinishRender',function ($timeout) {
    return {
        restrict: 'A',
        link: function (scope, element, attr) {
            if (scope.$last === true) {
                $timeout(function () {
                    scope.$emit('ngRepeatFinished');
                    // scope.isSelectShow = false;
                });
            }
        }
    }
});
然后再在控制器中进行监听,并调用初始化函数
$scope.$on('ngRepeatFinished', function(ngRepeatFinishedEvent) {

      var select = document.getElementById('mySelect');
              console.log(select);
        select.style ="width:100%;height:34px";
       
       $(".js-example-basic-single").select2();


});
然后再在Html页面绑定:
<tbody ng-repeat="row in convertdisplayed|filter:filter |paging:page.index:page.size"
       on-finish-render="ngRepeatFinished">
 
 
这个做法其实也就是用一个directive 来监听 ng-repeat 是否结束。这个问题的原因是:不应该将jquery插件和angular混用,这样做的话就会出现许多像现在这样要处理的麻烦。正确的做法是写一个directive,来完成你的插件需要做的事情 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Web魔法师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值