定义: $interpolate:编译一段带有嵌入标记的语句,然后返回一个interpolate(插值)函数。
使用: $interpolate(text,[mustHaveException],[trustContext],[allOrNothing])
text[String] 需要被编译的字符串(必需)
mustHaveException[boolean] : if true,当传入的字符串中不含有表达式时会返回null
trustContext[String] : AngularJS会对已经进行过字符插值操作的字符串通过 $sce.getTrusted(interpolatedResult, trustedContext) 方法进行严格的上下文转义
返回值:function(contest) 一个用来计算带有插值标记语句的函数,context为嵌入标记语句中的表达式提供上下文。
代码示例:

<div ng-app="MyApp">
    <div ng-controller="MyController">
        To:<input ng-model="to" type="text" placeholder="Recipient">
        <textarea ng-model="emailBody"></textarea>
        <pre>{{ previewText }}</pre>
    </div>
</div>

  

angular.module('MyApp', [])
  .controller('MyController', function($scope, $interpolate) {
      // 设置监听
      $scope.$watch('emailBody', function(body) {
        if (body) {
          var template = $interpolate(body);
          $scope.previewText = template({to: $scope.to});
         }
      });
});

在控制器中,我们设置了$watch来监视邮件正文的变化,并将emailBody属性的值进行字符串插值后的结果复制给previewText属性。在 {{ previewText }} 内部的文本中可以将 {{ to }} 当作一个变量来使用,并对文本的变化进行实时更新。

运行结果:

Edit in JSFiddle

如果需要在文本中使用不同于{{ }}的符号来标识表达式的开始和结束,可以在$inter polateProvider中配置。

用startSymbol()方法可以修改标识开始的符号。这个方法接受一个参数value(字符型):开始符号的值。
用endSymbol()方法可以修改标识结束的符号。这个方法也接受一个参数value(字符型):结束符号的值。
如果需要修改这两个符号的设置,需要在创建新模块时将$interpolateProvider注入进去。

angular.module('emailParser', [])
  .config(['$interpolateProvider', function($interpolateProvider) {
      $interpolateProvider.startSymbol('__');
      $interpolateProvider.endSymbol('__');
  }])
  .factory('EmailParser', ['$interpolate', function($interpolate) {
      // 处理解析的服务
      return {
        parse: function(text, context) {
          var template = $interpolate(text);
          return template(context);
        }
      };
 }]);
将服务注入到应用中: 
angular.module('MyApp', ['emailParser'])
  .controller('MyController', ['$scope', 'EmailParser',
      function($scope, EmailParser) {
        // 设置监听
        $scope.$watch('emailBody', function(body) {
        if (body) {
          $scope.previewText = EmailParser.parse(body, {to: $scope.to});
        }
      });
  }]);
<div id="emailEditor">
    <input ng-model="to" type="text" placeholder="Recipient" />
    <textarea ng-model="emailBody"></textarea>
</div>
<div id="emailPreview">
    <pre>__ previewText __</pre>
</div>

 

posted on 2019-07-23 21:53  qqhfeng16  阅读(206)  评论(0编辑  收藏  举报