我是angularJS的新手,可能写得不好......
但我怎么能正确实现这个插件:https://github.com/BeSite/jQuery.dotdotdot
在我的桌子上?
现在用我的代码我的编辑表格和表格真的不太快......真的太慢了......我做错了什么?
指令:
.directive('dotdotdot', function(){
return {
restrict: 'A',
link: function(scope, element, attributes) {
scope.$watch(function() {
element.dotdotdot({watch: true, wrap: 'letter'});
});
}
}
});
和表:
<table id="articles" class="table table-striped articles-table">
<thead>
<tr class="table-row">
<th data-ng-click="predicate = 'Date'; reverse=!reverse">Date<i ng-class="{'arrow-down' : (reverse && predicate==='Date') || (predicate!=='Date'), 'arrow-up' : !reverse && predicate==='Date'}"></i></th>
<th data-ng-click="predicate = 'Title'; reverse=!reverse">Title<i ng-class="{'arrow-down' : (reverse && predicate==='Title') || (predicate!=='Title'), 'arrow-up' : !reverse && predicate==='Title'}"></i></th>
<th data-sorter="false">article</th>
<th data-sorter="false"></th>
<th data-sorter="false"></th>
</tr>
</thead>
<tbody>
<tr data-ng-repeat="article in articles | orderBy:predicate:reverse" data-id="{{article.Id}}" class="table-row">
<td class="text-nowrap">
<div class="articles-cell">
{{article.Date}}
</div>
</td>
<td>
<div class="articles-cell article-text-area" dotdotdot>
{{article.Title}}
</div>
</td>
<td>
<div class="articles-cell">
<a href="javascript:void(0)" data-ng-click="showarticle(article)" data-toggle="modal" data-target="#new-article" class="action">
<img data-ng-src="{{article.Photo}}" data-err-src="images/no_photo.png" class="article-img img-rounded img-responsive" alt="article" />
</a>
</div>
</td>
<td>
<div class="articles-cell" dotdotdot>
<div class="content" data-ng-bind-html="article.Content" class="articles-row" ></div>
</div>
</td>
<td class="crud-arr">
</td>
</tr>
</tbody>
</table>
即使我通过绑定重写它 - 它也会慢下来...... 我做错了什么?
答案 0 :(得分:2)
正如@pankajparkar在评论中指出的那样,这确实不应该在$watch
中维护。这样做会在任何给定的会话中多次执行element.dotdotdot()
配置调用 - 例如,每次按下某个键或单击鼠标时。减速的一部分可能是插件本身以及它如何管理观看它,但除此之外你应该通过简单地删除$ watch来看到改进:
.directive('dotdotdot', function(){
return {
restrict: 'A',
link: function(scope, element, attributes) {
element.dotdotdot({watch: true, wrap: 'letter'});
}
}
});
答案 1 :(得分:1)
<强>模板强>
<li ng-repeat="movie in movies">
<div dma-dotdotdot>{{movie.title}}</div>
</li>
<强>指令强>
(function () {
'use strict';
angular.module('dma.common').directive('dmaDotDotDot', [
function dmaDotDotDot() {
return {
restrict: 'A',
link: function (scope, element, attrs) {
scope.$evalAsync(function () {
element.dotdotdot({
wrap: 'letter'
});
});
}
};
}
]);
}());
我测试了ng-bind,它似乎对我不起作用。 ng-bind隐藏内容,然后触发dotdotdot(),然后编译内容(这不起作用)。
虽然这应该可行 - 比范围更好的解决方案。$ watch。而且我认为它比没有$evalAsync()
列出的解决方案更加一致。
有关何时触发的详细信息,请参阅https://docs.angularjs.org/api/ng/type/ $ rootScope.Scope#$ evalAsync。
答案 2 :(得分:0)
我遇到了同样的问题,最后只是将一个类"dotdotdot"
应用到我希望jquery.dotdotdot
运行的所有元素,然后每当更新这些元素时手动调用$('.dotdotdot').dotdotdot()
。您必须小心不要使用$watch
或类似的东西,否则您将遇到与使用该指令时相同的问题。不是一个很好的解决方案,但效率很高。
不得不这样做,因为如果你在相关元素上使用rawHtml绑定或自定义过滤器,删除指令中的$watch
会产生奇怪的副作用。