Вам нужно будет использовать сервис $sce
Строгое контекстуальное экранирование .
Добавьте этот сервис в декларацию вашего контроллера, например:
controller('sampleController', ['$scope', '$http', '$sce', function($scope, $http, $sce) {
Теперь вы должны определить функцию, которая будет вставлять тег span
только с именем класса CSS желтого цвета, который будет выделен, когда найденный текст будет найден с помощью метода $sce.trustAsHtml
, чтобы укажите AngularJS, введенный является безопасным содержимым.
$scope.highlightText = function(text, search) {
if (search && search.length === 0) {
// Returns the default content.
return $sce.trustAsHtml(text);
}
// Define a regular expression to find the text globally and ignoring capital letters.
var regex = new RegExp(search, 'gi');
// If you already found the text then inject a span element with CSS class to highlight that you found.
return $sce.trustAsHtml(text.replace(regex, '<span class="foundText">$&</span>'));
};
В предыдущем тексте замены регулярного выражения $&
указывает на отображение захваченного текста, соответствующего регулярному выражение внутри заменяемого.
В HTML, в пределах ng-repeat
, добавьте директиву ngBindHtml
с функцией highlightText
, где первый параметр это текст, который вам нужно искать, а второй параметр - это текст, который нужно найти.
В вашем случае, таким образом:
<tr ng-repeat="user in users | filter:searchFilter">
<td style="border: 1px solid black ; width:30%;white-space: pre-wrap;" ng-bind-html="highlightText(user.gsx$topic.$t, search)">{{user.gsx$topic.$t}}</td>
См. в этом примере:
angular.module('sample', []).
controller('sampleController', ['$scope', '$http', '$sce', function($scope, $http, $sce) {
var url = "https://spreadsheets.google.com/feeds/list/153Obe1TdWlIPyveZoNxEw53rdrghHsiWU9l-WgGwCrE/od6/public/values?alt=json";
$http.get(url)
.success(function(data, status, headers, config) {
$scope.users = data.feed.entry;
console.log($scope.users);
})
.error(function(error, status, headers, config) {
console.log(status);
console.log("Error occured");
});
$scope.search = '';
$scope.searchFilter = function(item) {
if (item.gsx$topic.$t.indexOf($scope.search) != -1 || item.gsx$response.$t.indexOf($scope.search) != -1) {
return true;
}
return false;
};
$scope.highlightText = function(text, search) {
if (search && search.length === 0) {
// Returns the default content.
return $sce.trustAsHtml(text);
}
// Define a regular expression to find the text globally and ignoring capital letters.
var regex = new RegExp(search, 'gi');
// If you already found the text then inject a span element with CSS class to highlight that you found.
return $sce.trustAsHtml(text.replace(regex, '<span class="foundText">$&</span>'));
};
}]);
.foundText {
background-color: #ff0;
color: #f00;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.2.0/angular.min.js"></script>
<div ng-app="sample" ng-controller="sampleController">
<div class="black">
<input type="text" name="search" ng-model="search" placeholder="search" ng-click="didSelectLanguage()" />
</div>
<br>
<br>
<br>
<table style="border: 1px solid black ;">
<tbody>
<tr>
<td>
<center><b>Question</b></center>
</td>
<td>
<center><b>Response</b></center>
</td>
</tr>
<tr ng-repeat="user in users | filter:searchFilter">
<td style="border: 1px solid black ; width:30%;white-space: pre-wrap;" ng-bind-html="highlightText(user.gsx$topic.$t, search)">{{user.gsx$topic.$t}}</td>
<td style="border: 1px solid black ; width:70%;white-space: pre-wrap;" ng-bind-html="highlightText(user.gsx$response.$t, search)">{{user.gsx$response.$t}}</td>
</tr>
</tbody>
</table>
</div>
Надеюсь, это поможет!