用angularjs绑定repeat出来的图片怎么实现在加载完成前显示一张正在加载的占位图?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用angularjs绑定repeat出来的图片怎么实现在加载完成前显示一张正在加载的占位图?相关的知识,希望对你有一定的参考价值。
由于AngularJS通过“dirtychecking”函数来检测变化。每次检测都会花费时间,所以包含复杂数据结构的大型列表将降低应用的运行速度。如果是列表数据量大,缓解该问题,最好的办法是限制所显示列表的大小。可通过分页、添加无限滚动条来实现。如果不能/不想使用分页,但过滤过程又很慢,这时一定要检查前五步,并使用“ng-show”隐藏掉多余的列表元素。另外,将要显示的列表与总的数据列表分开,是非常有用的模型。可以对一些过滤进行预处理,并将存于缓存中的链接应用到视图上。不要使用内部指令,像ng-mouseenter,AngularJS会使的页面闪烁。另外如果需要的话一定要使用ng-if这样可以阻止渲染(与ng-show相比)。 参考技术Avar module = angular.module('testApp', [])
.controller('myC',function()
$scope.ta = [1,2,3,4,5,6];
)
.directive('onFinishRender', function ()
return
restrict: 'A',
link: function (scope, element, attr)
if (scope.$last === true)
element.ready(function ()
$("#r_img").remove();
);
);
<img id="r_img" src="xxxx/xx.jpg"/>
<p ng-repeat="t in ta" on-finish-render="test()">t</p>
</div>
AngularJs ng-repeat指令中怎么实现含有自定义指令的动态html
今天用angular写table的时候,遇到了一个问题。在ng-repeat中,含有动态的html,而这些html中含有自定义指令。
因为希望实现一个能够复用的table,所以定义了一个指令myStandTable,指令代码大概如下:
1 var myCommon = angular.module("myCommon",[]); 2 myCommon.directive("myStandTable", function () { 3 return { 4 restrict: "A", 5 templateUrl: "app/template/tableTem.html", 6 transclude: false, 7 replace: true, 8 controller: function ($scope,$compile, commonService) { 9 // do something... 10 }, 11 link: function (scope, element, attris) { 12 } 13 } 14 });
tableTem.html文件代码如下:
1 <div> 2 <table class="table table-hover table-bordered"> 3 <thead> 4 <tr> 5 <th ng-if="tableData.multiSelect"> 6 <input type="checkbox" id="check-all" ng-model="itemsChecked"> 7 <label for="check-all" class="fa" ng-class="{‘fa-square-o‘: !itemsChecked, ‘fa-check-square-o‘: itemsChecked }" aria-hidden="true"> 8 </label> 9 </th> 10 <th ng-repeat="item in tableData.thead">{{item}}</th> 11 </tr> 12 </thead> 13 <tbody> 14 <tr ng-repeat="item in tableData.items" ng-click="selectItem(item)" ng-init="item.selected = false" ng-class="{‘selected‘: item.selected}"> 15 <td ng-if="tableData.multiSelect"> 16 <input type="checkbox" id="check_{{$index}}" ng-model="item.selected"> 17 <label for="check_{{$index}}" class="fa" ng-class="{‘fa-square-o‘: !item.selected, ‘fa-check-square-o‘: item.selected }" aria-hidden="true"> 18 </label> 19 </td> 20 <td ng-repeat="name in tableData.theadName"> 21 {{item[name]}} 23 24 </td> 25 </tr> 26 </tbody> 27 </table> 28 </div>
控制器文件代码如下:
1 var myBasis = angular.module("myBasis",["myCommon"]); 2 myBasis.controller("myCtrl", function ($scope) { 3 $scope.tableData = { 4 multiSelect: false, 5 pageSize: [10, 20, 50], 6 thead: ["导入时间", "导入名称", "结果", "操作"], 7 theadName: ["importDate", "name", "result", "oper"] 8 }; 9 });
以上,完成了表格展示数据的功能,可是在表格列里面,经常有对某行数据的操作,而这些操作我们同样需要以html的形式插入到表格里面,并且这些html中,还会有ng-click等之类的指令,或者是自定义的指令。比如:"<a href=‘javascript:;‘ ng-click=‘show(item)‘>查看信息</a>"; 这类的html,插入到td中,会以html代码展示出来,并不会转换成html。
在网上查阅了方法后,找到了一个转html的解决办法,增加一个过滤器,如下:
1 myCommon.filter("trusted", function ($sce) { 2 return function (html) { 3 if (typeof html == "string") { 4 return $sce.trustAsHtml(html); 5 } 6 return html; 7 } 8 });
然后修改temp文件中的代码:
1 <td ng-repeat="name in tableData.theadName"> 2 <span ng-bind-html="item[name] | trusted"></span>3 </td>
通过以上方法,确实可以将html转成正常的结果,可是a标签上的ng-click却没有效果,查看了问题的关键,是这段html并没有经过angular的编译,所以ng-click不起作用,需要手动编译,修改如下:
temp文件代码修改:
1 <td ng-repeat="name in tableData.theadName"> 2 <div compile-bind-expn = "item[name]"> 3 </div> 4 </td>
当item[name] 等于 "<a href=‘javascript:;‘ ng-click=‘show(item)‘>查看信息</a>"时,我们需要通过compileBindExpn指令来手动编译,再放到div里面去。指令代码如下:
1 myCommon.directive("compileBindExpn", function ($compile) { 2 return function linkFn(scope, elem, attrs) { 3 scope.$watch("::"+attrs.compileBindExpn, function (html) { 4 if (html && html.indexOf("<") != -1 && html.indexOf(">") != -1) { 5 console.log(1); 6 var expnLinker = $compile(html); 7 expnLinker(scope, function transclude (clone) { 8 elem.empty(); 9 elem.append(clone); 10 }); 11 } else { 12 elem.empty(); 13 elem.append(html); 14 } 15 }) 16 } 17 });
经过这种解决方法后,终于能够正常展示html代码,且其上的ng-click方法也能正常使用。
以上是关于用angularjs绑定repeat出来的图片怎么实现在加载完成前显示一张正在加载的占位图?的主要内容,如果未能解决你的问题,请参考以下文章
ng-model 绑定到 ng-repeat Angularjs 中的元素
如何通过angularJS中的计数使用ng-repeat循环