我目前正在开发一个用户可以在文本区域输入文本的模块,以及一些具有以下格式的图像标签:
ii[5ae71206|100|100]ii
。
这就是我显示输入文字的方式:
<span ng-bind-html="localeCache[item.sysName][editLocale]['text1'] | imageFilter"></span>
&#34; imageFilter&#34; -filter应该使用<img>
从文本中替换我的自定义标记,因此ii[5ae71206|100|100]ii
变为:
<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;
}
};
});
}
);
过滤器会返回正确的字符串,但视图不会呈现图像。当我在没有自定义图像标记的情况下输入一些文本时,一切都按预期工作。 有什么想法吗?
答案 0 :(得分:0)
只需使用普通src
属性,因为ng-src需要再次$编译HTML。这是一个类似的工作示例。
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>
答案 1 :(得分:0)
我用过滤器编写的简单演示适用于我:
<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';
});
过滤逻辑中的问题
答案 2 :(得分:0)
好吧,我想我找到了问题:我在我的过滤器中有一个REST服务调用,我删除了我的初始帖子,因为我认为它不重要而且只会让人混淆:
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;
}
};
});
}
);
我通过向控制器添加另一个数组来解决这个问题,该控制器将图像标记映射到image-id,我需要从REST服务中获取正确的图像。该数组将传递给过滤器:
<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;
}
};
});
}
);