在AngularJS中截断绑定html
我正在使用truncate.js,它非常适合这样的代码:在AngularJS中截断绑定html,angularjs,truncate,Angularjs,Truncate,我正在使用truncate.js,它非常适合这样的代码: {{announcement.content | characters:25}} 但是,我似乎无法设置以下内容,也无法使其正常工作: <p ng-bind-html="parseTrustedHtml(announcement.content | characters : 25)"></p> 需要更多信息,但是您可以检查parseTrustedHtml方法/函数在$scope或$rootscope中是否可用
{{announcement.content | characters:25}}
但是,我似乎无法设置以下内容,也无法使其正常工作:
<p ng-bind-html="parseTrustedHtml(announcement.content | characters : 25)"></p>
需要更多信息,但是您可以检查parseTrustedHtml方法/函数在$scope或$rootscope中是否可用 我遇到了一个类似的问题,问题是角度截断是指字符串,而不是HTML。以下是我的解决方案:
标记:
<div class="container" ng-controller="parentCtrl">
<div ng-bind-html="text | limitHtml : maxNumberOfChar:'...' | trustAsHtml"></div>
</div>
代码:
.filter('trustAsHtml',['$sce',函数($sce){
返回$sce.trustAsHtml;
}])
.filter('limitHtml',function(){
返回函数(文本、限制、省略号){
var\u getClosedTagsString=函数(\u tagArray){
var _returnArray=[],
_getTagType=函数(\u字符串){
返回_string.replace(/]*)>/,“$1”);
};
角度.forEach(_标记数组,函数(_标记,_i){
如果(/不需要使用truncate.js
您可以使用自定义指令和筛选器解决此问题。
试试这个:你能提供一个JSIDdle吗?我不确定我能不能。我不能在JSIDdle上安装angular.js:(你能提供一个parseTrustedHtml函数吗?在控制器函数中试试$filter('characters')。
.filter('trustAsHtml', ['$sce', function($sce) {
return $sce.trustAsHtml;
}])
.filter('limitHtml', function() {
return function(text, limit, ellipsis) {
var _getClosedTagsString = function(_tagArray) {
var _returnArray = [],
_getTagType = function(_string) {
return _string.replace(/<[\/]?([^>]*)>/,"$1");
};
angular.forEach(_tagArray,function(_tag,_i) {
if(/<\//.test(_tag)) {
if(_i === 0) {
_returnArray.push(_tag);
} else if(_getTagType(_tag) !== _getTagType(_tagArray[_i - 1])) {
_returnArray.push(_tag);
}
}
});
return _returnArray.join('');
},
_countNonHtmlCharToLimit = function(_text,_limit) {
var _isMarkup = false,
_isSpecialChar = false,
_break = false,
_underLimit = false,
_totalText = 0,
_totalChar = 0,
_element,
_return = {
textCounter : 0,
offsetCounter : 0,
setEllipsis : false,
overElementArray : []
};
angular.forEach(_text,function(_c) {
_underLimit = _return.textCounter < _limit;
if(_c === '<' && !_isMarkup && !_isSpecialChar) {
(!_underLimit) && (_element = '<');
_isMarkup = true;
} else if(_c === '&' && !_isMarkup && !_isSpecialChar) {
_isSpecialChar = true;
} else if(_isMarkup) {
//tracking html elements that are beyond the text limit
(!_underLimit) && (_element = _element + _c);
if(_c === '>') {
//push element in array if it is complete, and we are
//beyond text limit, to close any html that is unclosed
(!_underLimit) && (_return.overElementArray.push(_element));
_break = true;
_isMarkup = false;
}
} else if(_c === ';' && _isSpecialChar) {
_isSpecialChar = false;
//count as one character
_return.textCounter++;
_break = true;
}
if(_underLimit) {
if(!_isMarkup && !_isSpecialChar && !_break) {
//counting number of characters in non html string
_return.textCounter++;
}
_return.offsetCounter++;
} else {
_return.setEllipsis = true
}
_break = false;
});
//returns offset within html of number of non html characters found
return _return;
},
_charToLimitOutput = _countNonHtmlCharToLimit(text.toString(),limit);
return text.toString().substr(0, _charToLimitOutput.offsetCounter) +
ellipsis + _getClosedTagsString(_charToLimitOutput.overElementArray);
}
})
.controller('parentCtrl', function($scope,$timeout) {
$scope.text = "<span><h1>Example </h1><p>Special Text</p><div>other stuff</div></span>";
$scope.maxNumberOfChar = 10;
});