代码之家  ›  专栏  ›  技术社区  ›  DCH

ng bind html-通过过滤器获取图像

  •  3
  • DCH  · 技术社区  · 7 年前

    我目前正在开发一个模块,在该模块中,用户可以在文本区域中输入文本,以及一些具有以下格式的图像标记:

    ii[5ae71206|100|100]ii .

    这是我显示输入文本的方式:

    <span ng-bind-html="localeCache[item.sysName][editLocale]['text1'] | imageFilter"></span>
    

    <img> 所以 变成:

    <img src="path-to-file-with-image-id-5ae71206" 
         style="max-width:100px;max-height:100px;">
    

    define(
        ['angularAMD', 'docService']
        , function(angularAMD){
            angularAMD.filter('imageFilter', function($rootScope, DocAdminService){
                return function(text) {
    
                    var regExImgTag = /ii\[(.*?)]ii/g;
                    var regExImg = /ii\[.*?\]ii/;
                    var imageTags = regExImgTag.exec(text);
    
                    if(imageTags !== null){
                        var tag = imageTags[1];
                        var parts = tag.split('|');
                        var imgTag = parts[0];
                        var width = parts[1];
                        var height = parts[2];
    
                       var imgString = '<img ng-src="' + $rootScope.path_to_REST_Service + imgTag + '" style="max-width:' + width + 'px; max-height:' + height + 'px;">';
                       var textNew = text.replace(regExImg, imgString);
                       console.log(textNew);
                        return (textNew);
                        });
                    }
                    else{
                        return text;
                    }
                };
            });
        }
    );
    

    过滤器确实返回了正确的字符串,但视图没有渲染图像。当我刚输入一些没有自定义图像标签的文本时,一切都按预期进行。 有什么想法吗?

    3 回复  |  直到 7 年前
        1
  •  0
  •   Thusitha    7 年前

    只需使用普通 src

    var app = angular.module("app", ["ngSanitize"]);
    app.controller("MainController", function($scope){
    
      $scope.localeCache = "Some text";
    
    });
    
    app.filter("imageFilter", function(){
        return function (input) {
        
            //Here you add modifications to the input.
            //This is just an example
            
            var width = "100px",
                imgPath = 'http://via.placeholder.com/350x150',
                height = "100px";
            
            return '<img src="' 
            + imgPath
            + '" style="max-width:'
            + width 
            + 'px; max-height:'
            + height 
            + 'px;">';
        }
    });
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
    
    <script src="https://cdnjs.cloudflare.com/ajax/libs/angular-sanitize/1.5.1/angular-sanitize.min.js"></script>
    
    <div ng-app="app" ng-controller="MainController">
      <span ng-bind-html="localeCache | imageFilter"> </span
    </div>
        2
  •  0
  •   Maxim Shoustin    7 年前

    <div ng-bind-html="path | imageFilter" ></div>
    

    JS公司

    app.filter('imageFilter', function($sce){
                return function(text) {
                  var html = $sce.trustAsHtml('<img src="' + text  +'" style="max-width:100px;max-height:100px;"/>'); 
                   return html;
                };
            });
    
    app.controller('FirstCtrl', function($scope, $sce) {
      $scope.path = 'https://media.mnn.com/assets/images/2014/09/running-with-dog.jpg.653x0_q80_crop-smart.jpg';
    });
    

    Demo Plunker

    滤波器逻辑内部的问题

        3
  •  0
  •   DCH    7 年前

    define(
        ['angularAMD', 'docService']
        , function(angularAMD){
    
            angularAMD.filter('imageFilter', function($rootScope, $sce, DocService){
                return function(text) {
    
                    var regExImgTag = /ii\[(.*?)]ii/g;
                    var regExImg = /ii\[.*?]ii/;
                    var imageTags = regExImgTag.exec(text);
    
                    if(imageTags !== null){
                        var tag = imageTags[1];
                        var parts = tag.split('|');
                        var imgTag = parts[0];
                        var width = parts[1];
                        var height = parts[2];
    
                        DocService.listDocsByParameters({ firstParam: 'textPropertyC/s/eq/' + btoa(imgTag) }, function(response){
                            var imgId = response[0].id;
    
                            var imgString = '<img src="' + $rootScope.restUrl + 'doc-rest/documentById/' + imgId + '" style="max-width:' + width + 'px; max-height:' + height + 'px;">';
                            var textNew = text.replace(regExImg, imgString);
                            console.log(textNew);
                            return textNew; //This is probably the problem.
                        });
                    }
                    else{
                        return text;
                    }
                };
            });
        }
    );
    

    <span ng-bind-html="localeCache[item.sysName][locale]['text1'] | imageFilter:imageMap"></span>
    

    过滤器如下所示:

    define(
        ['angularAMD']
        , function(angularAMD){
    
            angularAMD.filter('imageFilter', function($rootScope){
                return function(text, map) {
    
                    if(typeof map === 'undefined' || typeof text === 'undefined' || text === '' || text === null){
                        return text;
                    }
    
                    var regExImgTag = /ii\[(.*?)]ii/g;
                    var regExImg = /ii\[.*?]ii/;
                    var imageTags = regExImgTag.exec(text);
    
                    if(imageTags !== null){
                        var tag = imageTags[1];
                        var parts = tag.split('|');
                        var imgTag = parts[0];
                        var width = parts[1];
                        var height = parts[2];
    
                        var imgId = map[imgTag];
    
                        var imgString = '<img src="' + $rootScope.restUrl + 'doc-rest/documentById/' + imgId + '" style="max-width:' + width + 'px; max-height:' + height + 'px;">';
                        var textNew = text.replace(regExImg, imgString);
                        console.log(textNew);
                        return textNew;
                    }
                    else{
                        return text;
                    }
                };
            });
        }
    );