让 ng-repeat 在 AngularJS 的 $interpolate 服务中工作

2023-11-21

我正在使用 Bootstrap 的 AngularJs-UI 组件。我想将填写好的模板插入到弹出窗口功能的数据元素之一中。这适用于查找不在 ng-repeat 内部的所有元素。如何让 ng-repeat 元素在插值模板中工作?

我有一个笨蛋http://plnkr.co/edit/Cuku7qaUTL1lxRkafKzv它不起作用,因为我不知道如何将 Angular-UI-bootstrap 放入 plunker 中。

<div data-popover="{{createHTML()}}">some content</div>

我的本地范围有这个功能createHTML()看起来像这样。

angular.module('myApp', ['ngSanitize'])
  .controller("myController", function(myService){
    $scope.createHTML = function() {
      var thingy = { blah: "foobar", collection: [ "1", "2", "3" ] };
      return myService.html_for(thingy);
    }
  });

而且服务是

angular.module('myApp')
  .service('myService', function($templateCache, $interpolate, $sanitize, $log) {
    "use strict";

    function html_for(thingy) {
      var template = $templateCache.get('thingyTemplate.html'),
        link = $interpolate(template),
        html = link(thingy),
        unsafe = $sanitize(html);
      return unsafe;
    }

    return {
      html_for: html_for
    }
  });

模板:

<script type="text/ng-template" id="thingyTemplate.html">
  <div>
    <div><strong>Blah:</strong> {{blah}}</div>
    <div data-ng-repeat="foo in collection"><strong>Collection:</strong> {{foo}}</div>
    <div><strong>Collection[0]:</strong> {{collection[0]}}</div>
    <div><strong>Collection[1]:</strong> {{collection[1]}}</div>
    <div><strong>Collection[2]:</strong> {{collection[2]}}</div>
  </div>
</script>

<script type="text/ng-template" id="template/popover/popover.html">
<div class="popover {{placement}}" data-ng-class="{ in: isOpen(), fade: animation() }">
  <div class="arrow"></div>

  <div class="popover-inner">
    <h3 class="popover-title" data-ng-bind="title" data-ng-show="title"></h3>
    <div class="popover-content" data-ng-bind-html="content"></div>
  </div>
</div>
</script>

$interpolate不处理像这样的指令ngRepeat ( 解析、插值和编译之间的区别 ). $interpolate:

将带有标记的字符串编译为插值函数。这 HTML $compile 服务使用该服务进行数据绑定。

处理ngRepeat以及您想要的其他指令$compile。但对于你的用例$compile不幸的是,这将导致许多变化,因为:

  • 它需要一个编译范围,而不仅仅是像这样的上下文$interpolate。此外,它需要范围thingy is on.

    这意味着我们需要在模板中引用您的属性,例如 {{thingy.blah}} 而不是 {{blah}}。

  • 当弹出窗口位于 dom 上时需要进行编译。

  • 弹出窗口仅在打开时出现在 dom 上。

所以我们不能只是替换$interpolate with $compile在您的服务中。

一种方法是替换data-ng-bind-html使用以下指令,其作用类似于ng-bind-html有一个内置的$compile(显然,您应该只将其与您知道安全的 html 一起使用)。

.directive('compile', function($compile) {
  return function(scope, element, attrs) {
    scope.$watch(
      function(scope) {
        return scope.$eval(attrs.compile);
      },
      function(value) {
        var result = element.html(value);
        $compile(element.contents())(scope.$parent.$parent);
      }
    );
  };
});

像这样使用(与compile替换ng-bind-html:

  <div class="popover-content" compile="content"></div>

一个问题是我们需要thingy处于范围内。有几种处理方法 - 但出于演示目的,我手动返回到调用弹出窗口的范围 - 这是 2 个范围,因此scope.$parent.$parent.

使用这个编译指令你不再$interpolate or $sanitize因此,您的服务中的函数可以缩小为仅返回适当的模板:

function html_for() {
  var template = $templateCache.get('thingyTemplate.html');
  return template;
}

demo fiddle

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

让 ng-repeat 在 AngularJS 的 $interpolate 服务中工作 的相关文章

随机推荐

  • 如何获取通用扩展方法的MethodInfo?

    我有一个IEnumerable
  • 使用 PropertyInfo 找出属性类型

    我想动态解析对象树以进行一些自定义验证 验证本身并不重要 但我想更好地理解 PropertyInfo 类 我会做这样的事情 public bool ValidateData object data foreach PropertyInfo
  • MAC地址打印

    这是获取一些有关网络信息的代码 问题是当它打印 MAC 地址时 它会正常打印 有时与fff的 喜欢 00 21 84 a2 12 88 和 00 ffffff21 84 a2 12 ffffff88 因机器而异 这是代码 include
  • HttpWebRequest.EndGetResponse 在 Windows Phone 7 中引发 NotSupportedException

    在 Silverlight Windows Phone 7 项目中 我正在创建一个 HttpWebRequest 获取 RequestStream 向流中写入一些内容并尝试获取响应 但我总是收到 NotSupportedException
  • CGPathAddCurveToPoint 的参数是什么意思?

    我想建立一个CGPathRef以编程方式基于一天中不同时间点的太阳坐标 计算点数不是问题 但我想做一个CGPathRef那是顺利而有思想的CGPathAddCurveToPoint会是合适的 我了解路径 变换 x 和 y 参数 但我不确定其
  • python中按键减少

    我正在尝试思考在 python 中执行此操作的最有效方法 假设我有一个元组列表 dog 12 2 cat 15 1 dog 11 1 cat 15 2 dog 10 3 cat 16 3 假设我有一个函数 它接受其中两个元组并将它们组合起来
  • 为什么 DateTime.ToShortTimeString() 不尊重“区域和语言设置”中的短时间格式?

    我遇到了一个问题 可能是由于我对 DateTime ToShortTimeString 方法的工作原理的误解 当使用此函数格式化时间字符串时 我假设它会遵循 Windows 7 格式设置中的 短时间 设置 Control Panel gt
  • 在 Python 中以二进制格式写入和读取日期时间

    我想在 Python 中将日期时间列表存储在二进制文件中 编辑 二进制 是指每种数据类型的最佳数字表示 其用途是保存由 unix timestamp 纬度 经度 海拔 组成的GPS轨迹点 因此整个结构是little endian Long
  • 函数调用与局部变量

    我经常看到多次调用其他函数的函数 而不是存储一次函数的结果 i e 1 void ExampleFunction if TestFunction gt x TestFunction lt y TestFunction z a TestFun
  • 使用 R Shiny 框架的密码字段

    我打算为我的应用程序登录 为此我需要一个密码字段 我不知道闪亮是否用于此目的 但仍然可能吗 code for a simple text box is textInput id label value 但是有可能有密码字段吗 另外 与此同时
  • WPF 样式按钮 MouseOver 问题

    我正在尝试在按钮上制作一个简单的鼠标悬停效果 当鼠标悬停时它确实会改变颜色 但颜色会立即更改为默认按钮背景 我如何覆盖此行为 这是我的代码 Style myBtnStyle new Style Trigger bla new Trigger
  • Azure 导出 SQL 数据库示例

    鉴于 Microsoft 不推荐使用以前的导出 SQL DB 的方法 他们提出了一个建议的示例here subscriptionId YOUR AZURE SUBSCRIPTION ID Login AzureRmAccount Set A
  • 如何对 CursorLoader 结果进行排序?

    我使用 CursorLoader 查询结果 这不是我想要在 ListFramgenet 中显示的顺序 怎么排序呢 我用它来设置适配器 mAdapter new SimpleCursorAdapter getActivity android
  • 动态添加按钮到对话框

    有没有办法动态添加按钮到 jquery ui 中的对话框 我尝试使用 this add button 有时您也想稍后添加按钮 var mydialog result of jqueryui dialog var buttons mydial
  • 图像边框半径在 css 转换期间不起作用

    我在用着border radius 50 使图像变圆 默认情况下 图像会被模糊和缩放 带有隐藏的溢出 悬停时它将消除模糊和缩放 但是 当我在元素上使用 CSS 过渡时 它会在过渡期间暂时显示溢出 http jsfiddle net jonn
  • WatchOS 2:“无法安装手表应用程序”“启动‘TestApp WatchKit 应用程序扩展’时出错”

    每次我尝试在 Xcode 7 beta 4 中安装 watchOS 2 应用程序时 我都会在 iOS 上收到 AlertView 弹出错误 无法安装手表应用 TestApp 已安装在您的 iPhone 上 但 Apple Watch 的 T
  • 如何将 php 放入 JavaScript 中?

    我已经尝试过 但它不起作用 这里是tutorial我为此目的使用过 尝试这个
  • 使用 php 创建 api

    我想使用php开发一个简单的api 我的功能是 如果有人输入一些所需的值 那么他们将从我网站旁边的算法中获得计算结果 我不知道从哪里开始 并且也没有获得任何使用 PHP 的 API 示例代码 听起来您想创建一个其他人可以连接 发送答案和检索
  • 用于触摸手势的优秀 JavaScript 库或 jQuery 插件是什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我不需要像 Sencha
  • 让 ng-repeat 在 AngularJS 的 $interpolate 服务中工作

    我正在使用 Bootstrap 的 AngularJs UI 组件 我想将填写好的模板插入到弹出窗口功能的数据元素之一中 这适用于查找不在 ng repeat 内部的所有元素 如何让 ng repeat 元素在插值模板中工作 我有一个笨蛋h