在AngularJS中截断绑定html

在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中是否可用

我正在使用truncate.js,它非常适合这样的代码:

{{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&nbsp;</h1><p>Special Text</p><div>other stuff</div></span>";
        $scope.maxNumberOfChar = 10;
    });