Angular:使用带有ng-bind-html的transclude

时间:2014-12-08 19:25:38

标签: javascript angularjs angularjs-directive transclusion ng-bind-html

我有以下角度设置:

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!

1 个答案:

答案 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之间的差异。