我有以下角度设置:
var app = angular.module('app', []);
app.filter('unsafe', function($sce) {
return $sce.trustAsHtml;
});
app.controller('SearchController', ['$scope', '$http', function($scope, $http) {
$scope.searchString = '';
$scope.searchType = 'Artist';
$scope.updateHtml = function() {
$http.get('/search', {
params: {
searchString: $scope.searchString,
searchType: $scope.searchType
}
}).success(function(data) {
$scope.html = data;
}).error(function(err){
$scope.html = err;
});
};
$scope.updateHtml();
}]);
app.directive('searchDirective', function() {
return {
restrict: 'A',
transclude: true,
template: '<div ng-bind-html="html | unsafe" ng-transclude></div>'
};
});
它通过控制器中的ajax拉取原始html标记,并将其存储在@scope.html
中。在该指令中,此html通过ng-bind-html
插入到DOM中。
html (jade)如下所示:
#search(ng-controller="SearchController" search-directive)
它基本上有效。但是在这个包含的html里面,我有一些翻译的内容,比如{{searchType}}
我希望得到解决。不幸的是,事实并非如此,它在浏览器中显示“{{searchType}}”。我可以改变什么来使翻译工作?
我读过$compile
和$transclude
,但我不知道如何使用它,或者它是否可以帮我解决问题。 THX!
答案 0 :(得分:2)
app.controller('SearchController', ['$scope', '$http', '$interpolate',
function($scope, $http, $interpolate) {
$scope.searchString = '';
$scope.searchType = 'Artist';
$scope.updateHtml = function() {
$http.get('/search', {
params: {
searchString: $scope.searchString,
searchType: $scope.searchType
}
}).success(function(data) {
$scope.html = $interpolate(data)($scope); // <<-- difference here
}).error(function(err){
$scope.html = err;
});
};
$scope.updateHtml();
}]);
现在我的html基于传入的范围进行插值。谢谢!
修改强>
$interpolate
仅用于呈现DOM并通过范围解析它。它只是返回普通的HTML。如果你需要实际检索一个完整的工作html模板,其中包含角度代码,请使用$compile
。我发现this answer非常有助于整理$interpolate
,$compile
和$parse
之间的差异。