Ng-Bind-Html 在 ng-repeat 中
Ng-Bind-Html inside ng-repeat
我正在制作一个自定义自动建议组件,我在其中使用搜索词点击网络服务,它 returns 我显示的建议列表。
我的问题是,我想将列表中的匹配项加粗,而 angular 与额外的 html 搭配起来效果不佳。我已经看到无数使用 ng-bind-html 的示例,如果我可以绑定到特定值,但不能绑定到动态值列表,我就可以开始工作了。
这是我的第一个 angular 项目,所以我确定我缺少一些简单的东西。我发布的代码正确呈现 html 但它只多次显示最后的结果(我明白为什么)。
我怎样才能完成我想做的事情?
这是我的翡翠代码:
#search-main(ng-controller="autocomplete" data-api-url="/autocomplete.json")
input(type="search" placeholder="Search" ng-model="termToComplete")
input(type="image" name="submit" src="/search-icon.gif", alt="Submit")
ul.autoSuggest(ng-if="items.length")
li.fade-in(ng-repeat="item in items")
h2: a(href="{{item.url}}" ng-bind-html="html")
这是我的一些js
app.filter('html', ['$sce', function ($sce) {
return function (text) {
return $sce.trustAsHtml(text);
};
}])
app.controller('autocomplete', function($scope, $element, $timeout, acAPIservice, $location, $sce){
$scope.items = [];
$scope.apiUrl = $element.attr('data-api-url');
$scope.termToComplete = undefined;
$scope.showSuggestion = function(){
var payload = {
term : $scope.termToComplete
}
acAPIservice.getSearch($scope.apiUrl, payload)
.success(function(data){
$scope.items = $scope.items.concat(data.results);
$scope.findMatch();
})
.error(function(data, status, headers, config){
$scope.items = [];
});
}
//iterates over the results and bolds matching terms
$scope.findMatch = function(){
var term = $scope.termToComplete;
angular.forEach($scope.items, function(value, key){
$scope.items[key].title = $sce.trustAsHtml($scope.items[key].title.replace(new RegExp('(^|)(' + term + ')(|$)','ig'), '<b></b>'));
$scope.html = $scope.items[key].title;
});
}
$scope.$watch('termToComplete', function(newValue, oldValue) {
// reset everything
$scope.items = [];
$scope.start = 0;
$scope.end = 0;
$scope.total = 0;
// if we still have a search term go get it
if($scope.termToComplete){
$scope.showSuggestion();
}
});
});
这是我的测试-Json :
{
"start" : 1,
"end" : 8,
"total" : 27,
"results" : [{
"id" : 0,
"title" : "here is a title",
"url" : "google.com"
}, {
"id" : 1,
"title" : "here is another title",
"url" : "google.com"
}, {
"id" : 2,
"title" : "and another title",
"url" : "google.com"
}]
}
注意:
acAPIservice
只是一个点击 API 和 returns 数据的工厂
您不需要定义 $scope.html
,因为您已经将 HTML 分配给 title
。
您只需在 ng-repeat
循环中正确使用它:
li.fade-in(ng-repeat="item in items")
h2: a(ng-href="{{item.url}}" ng-bind-html="item.title")
我还建议使用 ng-href
而不仅仅是 href
,因为您正在为 link 使用 angular 表达式 ;)
我正在制作一个自定义自动建议组件,我在其中使用搜索词点击网络服务,它 returns 我显示的建议列表。
我的问题是,我想将列表中的匹配项加粗,而 angular 与额外的 html 搭配起来效果不佳。我已经看到无数使用 ng-bind-html 的示例,如果我可以绑定到特定值,但不能绑定到动态值列表,我就可以开始工作了。
这是我的第一个 angular 项目,所以我确定我缺少一些简单的东西。我发布的代码正确呈现 html 但它只多次显示最后的结果(我明白为什么)。
我怎样才能完成我想做的事情?
这是我的翡翠代码:
#search-main(ng-controller="autocomplete" data-api-url="/autocomplete.json")
input(type="search" placeholder="Search" ng-model="termToComplete")
input(type="image" name="submit" src="/search-icon.gif", alt="Submit")
ul.autoSuggest(ng-if="items.length")
li.fade-in(ng-repeat="item in items")
h2: a(href="{{item.url}}" ng-bind-html="html")
这是我的一些js
app.filter('html', ['$sce', function ($sce) {
return function (text) {
return $sce.trustAsHtml(text);
};
}])
app.controller('autocomplete', function($scope, $element, $timeout, acAPIservice, $location, $sce){
$scope.items = [];
$scope.apiUrl = $element.attr('data-api-url');
$scope.termToComplete = undefined;
$scope.showSuggestion = function(){
var payload = {
term : $scope.termToComplete
}
acAPIservice.getSearch($scope.apiUrl, payload)
.success(function(data){
$scope.items = $scope.items.concat(data.results);
$scope.findMatch();
})
.error(function(data, status, headers, config){
$scope.items = [];
});
}
//iterates over the results and bolds matching terms
$scope.findMatch = function(){
var term = $scope.termToComplete;
angular.forEach($scope.items, function(value, key){
$scope.items[key].title = $sce.trustAsHtml($scope.items[key].title.replace(new RegExp('(^|)(' + term + ')(|$)','ig'), '<b></b>'));
$scope.html = $scope.items[key].title;
});
}
$scope.$watch('termToComplete', function(newValue, oldValue) {
// reset everything
$scope.items = [];
$scope.start = 0;
$scope.end = 0;
$scope.total = 0;
// if we still have a search term go get it
if($scope.termToComplete){
$scope.showSuggestion();
}
});
});
这是我的测试-Json :
{
"start" : 1,
"end" : 8,
"total" : 27,
"results" : [{
"id" : 0,
"title" : "here is a title",
"url" : "google.com"
}, {
"id" : 1,
"title" : "here is another title",
"url" : "google.com"
}, {
"id" : 2,
"title" : "and another title",
"url" : "google.com"
}]
}
注意:
acAPIservice
只是一个点击 API 和 returns 数据的工厂
您不需要定义 $scope.html
,因为您已经将 HTML 分配给 title
。
您只需在 ng-repeat
循环中正确使用它:
li.fade-in(ng-repeat="item in items")
h2: a(ng-href="{{item.url}}" ng-bind-html="item.title")
我还建议使用 ng-href
而不仅仅是 href
,因为您正在为 link 使用 angular 表达式 ;)