品优购-高亮显示 1.1 需求分析 将用户输入的关键字在标题中以红色的字体显示出来,就是搜索中常用的高亮显示.
1.1 后端代码 修改服务层代码 ItemSearchServiceImpl.java
创建私有方法,用于返回查询列表的结果(高亮) [AppleScript] 纯文本查看 复制代码 /**
*根据关键字搜索列表
*@param keywords
*@return
*/
private Map searchList(Map searchMap){ Map map=new HashMap();
HighlightQuery query=new SimpleHighlightQuery();
HighlightOptions highlightOptions=new
HighlightOptions().addField("item_title");//设置高亮的域 highlightOptions.setSimplePrefix("<em style='color:red'>");//高亮前缀
highlightOptions.setSimplePostfix("</em>");//高亮后缀
query.setHighlightOptions(highlightOptions);//设置高亮选项
//按照关键字查询Criteria criteria=new
Criteria("item_keywords").is(searchMap.get("keywords"));
query.addCriteria(criteria);
HighlightPage<TbItem> page = solrTemplate.queryForHighlightPage(query, TbItem.class);
for(HighlightEntry<TbItem> h: page.getHighlighted()){//循环高亮入口集合 [AppleScript] 纯文本查看 复制代码 TbItem item = h.getEntity();//获取原实体类
if(h.getHighlights().size()>0 && h.getHighlights().get(0).getSnipplets().size()>0){
item.setTitle(h.getHighlights().get(0).getSnipplets().get(0));//设
置高亮的结果
}
}
map.put("rows",page.getContent());
return map;
}
修改 ItemSearchServiceImpl 的 search 方法,调用刚才编写的私有方法 [AppleScript] 纯文本查看 复制代码 @Override
public Map<String, Object> search(Map searchMap) { Map<String,Object> map=new HashMap<>();
//1.查询列表
map.putAll(searchList(searchMap));
return map;
} 1.1 前端代码 我们测试后发现高亮显示的 html 代码原样输出,这是 angularJS 为了防止 html 攻击采取的安全机制。我们如何在页面上显示 html 的结果呢?我们会用到$sce 服务的 trustAsHtml 方法来实现转换。
因为这个功能具有一定通用性,我们可以通过 angularJS 的过滤器来简化开发,这样只写一次,调用的时候就非常方便了,看代码: (1)修改 base.js [AppleScript] 纯文本查看 复制代码 // 定义模块:
var app = angular.module("pinyougou",[]);
/*$sce 服 务 写 成 过 滤 器 */ app.filter('trustHtml',['$sce',function($sce){
return function(data){
return $sce.trustAsHtml(data);
}
}]); [AppleScript] 纯文本查看 复制代码 (2)使用过滤器
ng-bind-html 指令用于显示 html 内容竖线 |用于调用过滤器 [AppleScript] 纯文本查看 复制代码 <div class="attr" ng-bind-html="item.title | trustHtml"></div>
|就是竖线,看起来有点斜是因为字体原因。
|