当前位置: 首页 > 面试题库 >

在元素内插入一个有角度的js模板字符串

宦砚
2023-03-14
问题内容

我试图在元素中放入一些有角度的js模板字符串,并期望得到编译的输出。但这没有发生。

HTML

<div ng-controller="testController">
    <div ng-bind-html-unsafe="fruitsView"></div>
</div>

控制器:

function filterController($scope){
    ...
    $scope.arr = ["APPLE", "BANANA"];
    $scope.fruitsView = '<div><p ng-repeat="each in arr">{{each}}</p></div>';
}

输出是正义的{{each}}

那么如何$scope.fruitsView元素内插入一个有角度的js模板字符串(here )?

我为此做了一个小提琴。


问题答案:

在这种情况下,您不希望仅“插入HTML”,而是对其进行编译。您可以使用该$compile服务创建DOM节点。

var tpl = $compile( '<div><p ng-repeat="each in arr">{{each}}</p></div>' )( scope );

如您所见,$compile返回一个函数,该函数将范围对象作为参数,对代码进行评估。element.append()例如,可以使用将结果内容插入DOM

重要说明 :但是在 任何情况下 ,控制器中都不会包含任何与DOM相关的代码。正确的地方 始终
是指令。可以将这些代码轻松地放入指令中,但是我不知道为什么您要以编程方式完全插入HTML。

您能否在这里阐明一些信息,以便我提供更具体的答案?

更新资料

假设您的数据来自服务:

.factory( 'myDataService', function () {
  return function () {
    // obviously would be $http
    return [ "Apple", "Banana", "Orange" ];
  };
});

您的模板来自服务

.factory( 'myTplService', function () {
  return function () {
    // obviously would be $http
    return '<div><p ng-repeat="item in items">{{item}}</p></div>';
  };
});

然后,您创建一个简单的指令,该指令读取提供的模板,对其进行编译,然后将其添加到显示中:

.directive( 'showData', function ( $compile ) {
  return {
    scope: true,
    link: function ( scope, element, attrs ) {
      var el;

      attrs.$observe( 'template', function ( tpl ) {
        if ( angular.isDefined( tpl ) ) {
          // compile the provided template against the current scope
          el = $compile( tpl )( scope );

          // stupid way of emptying the element
          element.html("");

          // add the template content
          element.append( el );
        }
      });
    }
  };
});

然后从您的角度来看:

<div ng-controller="MyCtrl">
   <button ng-click="showContent()">Show the Content</button>
   <div show-data template="{{template}}"></div>
</div>

在控制器中,您只需将其捆绑在一起:

.controller( 'MyCtrl', function ( $scope, myDataService, myTplService ) {
  $scope.showContent = function () {
    $scope.items = myDataService(); // <- should be communicated to directive better
    $scope.template = myTplService();
  };
});

它应该一起工作!

PS:这都是假设您的模板来自服务器。如果不是,则您的模板应位于指令中,这可以简化操作。



 类似资料:
  • 问题内容: 有没有一种pythonic方式将元素插入字符串中的每个第二个元素? 我有一个字符串:“ aabbccdd”,我希望最终结果是“ aa-bb-cc-dd”。 我不确定该怎么做。 问题答案: 假设字符串的长度始终是偶数, 该也可以消除 算法是将字符串分组为对,然后将其与字符连接在一起。 代码是这样写的。首先,它分为奇数位和偶数位。 然后使用该函数将它们组合成一个可迭代的元组。 但是元组不是

  • 问题内容: 我有一个非常基本的模板(basic_template.html),并希望使用使用另一部分模板格式化的数据来填写。basic_template.html可能包含使用部分模板格式化的几件事。 我应该如何在views.py中构建代码? 我这样做的原因是稍后将使用Ajax填充。我这样做对吗? 问题答案: 你可以做: 另一个Django模板在哪里。在这里,你可以放入将用Ajax获得的HTML。

  • 问题内容: 目的: 在Golang中的字符串中每x个字符插入一个字符 输入: 预期产量: 尝试次数 尝试一次 结果是: 尝试两次 计算字符数 对于循环 如果X = 5,则插入一个 尝试三 扫描结合加入 问题 目前尝试两次和三次不包含代码段的原因是,我仍在思考应该使用哪种方法在Golang中的字符串中每X个字符插入一个字符。 问题答案: https://play.golang.org/p/HEGbe

  • 内建的 <template> 元素用来存储 HTML 模板。浏览器将忽略它的内容,仅检查语法的有效性,但是我们可以在 JavaScript 中访问和使用它来创建其他元素。 从理论上讲,我们可以在 HTML 中的任何位置创建不可见元素来储存 HTML 模板。那 <template> 元素有什么优势? 首先,其内容可以是任何有效的HTML,即使它通常需要特定的封闭标签。 例如,我们可以在其中放置一行表

  • 问题内容: 我是angularJs的新手。我正在尝试创建包含输入元素和按钮的新指令。我想使用此指令在单击按钮时清除输入文本。 当我在html中使用指令时,出现以下错误: 的HTML: clearable_input.js: 我无法弄清楚如何实现这一目标。 问题答案: 好吧,这个错误是不言自明的。您的模板需要具有一个根,而您的必须具有两个根。解决此问题的最简单方法是将整个内容包装在a 或a中: 之前

  • 问题内容: 给定以下XML文件: 我想 在某个预先存在的元素之后 添加一个新 元素 。例如,如果要在之后添加节点,则新的XML应该如下所示: 我必须通过在函数中使用Java DOM来执行此操作。函数签名应如下所示: 哪里: 是预先存在的元素,之后将进行插入; 是插入的元素类型; 是新插入的元素的名称属性。 目前,我缺乏JDOM或任何其他Java XML库的经验。 您能提供一个示例代码,还是将我指向