[英]Pre-processing AngularJS output
我想在更新任何HTML之前為AngularJS添加一個預處理步驟。 為了簡單起見,讓我們把所有hello
實例都加粗。
也就是說,如果我們讓$scope.text = "hello world!"
,我們想以某種方式擁有
{{ text }}
在$digest
周期中進行評估
<b>hello</b> world!
如果更改了$scope.text
,那么這當然會根據需要進行更新。
怎么做? 優選地,它將是一個指令,因此將處理<div boldhello></div>
中的任何表達式。
datasage的評論很明顯 - 這是一個過濾器的好地方。 這是一個基於文檔示例的基本過濾器,它替換了任何hello
實例,其中一個被粗體標記包圍:
(function(angular) { 'use strict'; angular.module('myFilterApp', []) .filter('boldHello', function($sce) { return function(input) { input = input || ''; var out = input.replace(/hello/gi, function(text) { return '<b>' + text + '</b>'; }); return out; }; }) .controller('MyController', ['$scope', function($scope) { $scope.greeting = 'Oh, hello, my friend.'; }]); })(window.angular);
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> <body ng-app="myFilterApp"> <div ng-controller="MyController"> <input ng-model="greeting" type="text"><br> No filter: {{greeting}}<br> Bold: {{greeting | boldHello}}<br> </div> </body>
但是,唉,標簽印在輸出中! 這是因為Angular可以防止意外的HTML注入(可能包含script
標記),因此我們需要將此標記為顯式安全。 使用trustAsHtml
標記它是安全的,我們需要使用ng-bind-html
指令將結果放入模板中。
(function(angular) { 'use strict'; angular.module('myFilterApp', []) .filter('boldHello', function($sce) { return function(input) { input = input || ''; var out = input.replace(/hello/gi, function(text) { return '<b>' + text + '</b>'; }); return $sce.trustAsHtml(out); }; }) .controller('MyController', ['$scope', function($scope) { $scope.greeting = 'Oh, hello, my friend.'; }]); })(window.angular);
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> <body ng-app="myFilterApp"> <div ng-controller="MyController"> <input ng-model="greeting" type="text"><br> No filter: {{greeting}}<br> Bold: <span ng-bind-html="greeting | boldHello"></span><br> </div> </body>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.