在指令中使用 $compile 会触发 AngularJS 无限摘要错误

2023-12-27

关于为什么该指令会触发无限摘要错误有什么想法吗?

http://jsfiddle.net/smithkl42/cwrgLd0L/13/ http://jsfiddle.net/smithkl42/cwrgLd0L/13/

var App = angular.module('prettifyTest', []);
App.controller('myCtrl', function ($scope) {
    $scope.message = 'Hello, world!';
})

App.directive('prettify', ['$compile', function ($compile) {
    var template;
    return {
        restrict: 'E',
        link: function (scope, element, attrs) {
            if (!template) {
                template = element.html();
            }
            scope.$watch(function () {
                var compiled = $compile(template)(scope);
                element.html('');
                element.append(compiled);
                var html = element.html();
                var prettified = prettyPrintOne(html);
                element.html(prettified);
            });
        }
    };
}]);

这似乎是该行的第一行scope.$watch()触发模型更新的函数,因为当我删除该行时,它不会触发错误。

var compiled = $compile(template)(scope);

我有点困惑为什么该行会触发另一个 $digest - 它似乎没有直接更新任何内容scope.

有没有更好的方法来完成我想要做的事情,例如,使用其他方法来检查范围中的键值是否实际上已更改,以便我可以重新编译模板? (有没有更好的方法来获取模板?)


当你使用scope.$watch()只需一个函数而没有监视表达式,它会注册一个在每个摘要周期触发的监视程序。既然你打电话来了$compile在该观察程序中,每次都会有效地触发另一个摘要周期,因为它需要处理由模板创建的观察程序。这有效地创建了您的无限消化循环。

要使用相同的代码,您可能应该只在 postLink 函数中编译一次,但我认为您甚至不需要这样做 - 您应该能够只使用template财产。那么你的$watch()语句应包含一个针对您想要监视更改的属性的表达式 - 在本例中,只需'message',并相应地更新 HTML。

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

在指令中使用 $compile 会触发 AngularJS 无限摘要错误 的相关文章

  • Javascript 函数查找数字的倍数

    创建一个名为的函数multiplesOf 它将接受两个参数 第一个参数是数字数组 第二个参数是数字 该函数应返回一个新数组 该数组由参数数组中的每个数字组成 该数字是参数数字的倍数 So multiplesOf 5 6 7 8 9 10 3
  • 在 contenteditable div 中选择范围

    我有一个contenteditablediv 和其中的一些段落 这是我的代码 div style border solid 1px black width 300px height 300px div Hello world div div
  • 渲染货币和符号并与来自不同单元格的数据相结合

    我正在使用最新的 jQuery DataTables v1 10 7 我正在尝试将数字解析为以下格式 239 90 USD 我可以使用此命令使货币正常工作 columns data Price render fn dataTable ren
  • socket.io 的良好初学者教程? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Javascript Promise“then”始终运行,即使 Promise 未能执行

    我希望当调用第二个 then 时不执行第三个 then 但是 即使 Promise 被拒绝 调用第二个 then 并且代码返回 rejected 然后返回 undefined 它仍然调用第三个 then 如何不运行第三个 then 这样 未
  • 如何在react-bootstrap中禁用表单提交的

    在下面的代码片段中 我有许多文本类型的输入表单 如果用户点击 我似乎会得到相同的合成事件 就像他们按下提交按钮一样 我想忽略作为表单提交 只允许一个人按下 提交 按钮 我删除了一些表单组以减少示例 在所有情况下 按钮或 ENTER 键 e
  • 隐藏 Div 的父级

    我只是想隐藏父divcomments section div class content content green div div div 我试过这个 document getElementById comments section pa
  • Draggable JS Bootstrap 模式 - 性能问题

    对于工作中的项目 我们在 JavaScript 中使用 Bootstrap Modal 窗口 我们想让一些窗口可移动 但我们遇到了 JQuery 的性能问题 myModal draggable handle modal header Exa
  • 防止 iOS 键盘在 cordova 3.5 中滚动页面

    我正在使用 Cordova 3 5 和 jQuery mobile 构建 iOS 应用程序 我在大部分应用程序中禁用了滚动功能 但是 当我选择输入字段时 iOS 键盘会打开并向上滚动页面 我不想要这个功能 由于输入足够高 键盘不会覆盖它 我
  • 如何纠正流警告:解构(缺少注释)

    我正在编写一个小型 React Native 应用程序 并且正在尝试使用 Flow 但我无法在任何地方真正获得有关它的正确教程 我不断收到错误 destructuring Missing annotation 有关 station 这段代码
  • 设置 cookie 时中断 JavaScript 执行

    当设置 cookie 时 是否可以始终中断浏览器开发人员工具中的 javascript 执行 无需显式设置 JS 断点 document cookie 在 html head 块的开头添加此代码片段效果很好
  • Chrome 扩展程序在代码中使用 client_secret

    我正在开发具有自己的 oAuth 授权的 Google Chrome 扩展 当然 我必须使用 client id 和 client secret 作为请求令牌 有什么办法可以向用户隐藏这些数据吗 由于此请求只是 javascript 源代码
  • Vuejs 2:去抖动不适用于手表选项

    当我在 VueJs 中反跳此函数时 如果我提供毫秒数作为原语 它就可以正常工作 但是 如果我将其提供为对 prop 的引用 它会忽略它 这是道具的缩写版本 props debounce type Number default 500 这是不
  • 正则表达式 - 从 markdown 字符串中提取所有标题

    我在用灰质 https www npmjs com package gray matter 以便将文件系统中的 MD 文件解析为字符串 解析器产生的结果是这样的字符串 n Clean er ReactJS Code Conditional
  • 使用 Vue 的多模式组件

    我在 Vue 中实现动态模式组件时遇到问题 A common approach I follow to display a set of data fetched from the db is I dump each of the rows
  • 代码镜像错误:未捕获错误:扩展集中无法识别扩展值([对象对象])

    全部 我目前正在从事一个React Electron项目 该项目的目标是完成一个Markdown编辑器 当我配置codemirror 该程序报告错误说 Uncaught Error Unrecognized extension value
  • Javascript - 水波纹效果

    我需要 JS 上的脚本 它将以 水波纹 样式更改 images html 抱歉 6MB GIF 文件 http fcuunited ru temp listening2 gif http fcunited ru temp listening
  • Javascript Replace() 和 $1 问题

    我正在尝试创建一个脚本来搜索文本中的模式并在它找到的字符串周围包裹一个标签 shop attributes td each function this html function i html return html replace E 0
  • 如何使用asm.js进行测试和开发?

    最近我读到asm js规范 看起来很酷 但是是否有任何环境 工具来开发和测试这个工具 这还只是处于规范阶段吗 您可以尝试使用 emscripten 和 ASM JS 1 并从侧分支在 firefox 构建中运行它 有关 asm js 的链接
  • 如何在react-highcharts中使用图表工具提示格式化程序?

    如何使用图表工具提示格式化程序 我正在使用高图表的反应包装器 我有这样的配置 const CHART CONFIG tooltip formatter tooltip gt var s b this x b each this points

随机推荐

  • CALayer 的动画结束回调?

    我想知道 CALayer 中动画的回调在哪里 或者是否有任何东西 具体来说 对于隐式动画 例如更改框架 位置等 在 UIView 中 您可以执行以下操作 UIView beginAnimations SlideOut context nil
  • ng-bootstrap 模式不显示

    我在我的应用程序中使用 ng bootstrap 模式来显示对话框 但是当单击按钮时 什么也没有发生 模式没有显示 在调试时 它可能会发现该操作被调用 但模式未显示 这是我的 app module ts import NgModule fr
  • Vaadin Binder 中的上传组件,例如粗略编辑器

    我有一个 Crud 来自 Vaadin Pro 并且想使用 BinderCrudEditor 中的上传组件 Upload 组件不存储值 或者更确切地说 缺少 HasValue 接口 因此我无法使用 Binder 有没有什么方法可以以某种方式
  • persp() 轴标签中的下标

    我正在尝试使用以下函数绘制两个变量的函数persp R 中的函数 这是我到目前为止所拥有的 C unab lt function u1 u2 return u1 u2 x lt seq 0 1 by 0 1 y lt seq 0 1 by
  • 同时绘制 3D 平面和点

    我正在尝试使用 Matplotlib 同时绘制一个平面和 3D 中的一些点 我没有错误 只是点不会出现 我可以在不同时间绘制一些点和平面 但不能同时绘制 代码部分如下所示 import numpy as np import matplotl
  • 尝试在 Android Studio 上运行增强

    我正在尝试在 Android Studio 中设置 jdo jpa 并遵循上一个问题的答案here https stackoverflow com questions 23303893 google apps engine backend
  • 接口实现(接口隔离原则)

    我遇到一种情况 我需要调用第三方服务来获取一些信息 这些服务对于不同的客户可能会有所不同 我的界面中有一个身份验证功能 如下所示 interface IServiceProvider bool Authenticate string use
  • LinqPad 不使用 C# 语句返回结果

    已经很晚了 所以这一定是愚蠢的事情 我已将 LinqPad 连接到我的数据库 但似乎无法获得最简单查询的结果 var q from app in AppInstances select new AppId app AppId 当我运行它时
  • 在视图中获取 Laravel 5 控制器名称

    我们旧网站 CSS 的设置是为了body标签有一个控制器名称的 id 和一个动作名称的类 使用 Zend Framework 1 现在我们切换到 Laravel 5 我找到了一种通过Route类 但找不到控制器名称的方法 我在 Larave
  • 通过字符串在对象图中查找属性

    我正在尝试使用访问嵌套类结构的各个部分随意的细绳 给定以下 人为的 类 public class Person public Address PersonsAddress get set public class Adddress publ
  • SQL Server 查询超时

    访问 SQL Server 2012 数据库的第 3 方应用程序正在获取 Microsoft ODBC SQL Server Driver Query timeout expired执行大约20分钟后出现错误 这是应用程序开始接收错误后我在
  • Php 标头位置重定向不起作用

    不知道为什么这不起作用 这是代码 if isset POST cancel POST cancel cancel header Location page1 php echo POST cancel 此输出不是重定向页面 而是cancel到
  • java.lang.RuntimeException: CronExpression '4 27 11 ? 8? 2014' 无效,

    将此作为无效的 CronExpression 无法弄清楚为什么 转介http www quartz scheduler org documentation quartz 1 x tutorials crontrigger http www
  • 将类型参数约束为基类型

    我知道如何强制类型参数成为subtype另一种类型 public interface IMapping
  • Zend Zend_File_Transfer_Adapter_Http重命名问题

    我有一个关于在 Zend 中上传文件后重命名文件的问题 我不知道将重命名过滤器放在哪里 这就是我所拥有的 我尝试过移动东西 但我迷路了 目前 它确实将文件上传到我的照片文件夹 但没有重命名 谢谢你的帮助 if this gt request
  • iOS 上 UIVIew 和 CALayer 关于背景图片的关系

    试图理解UIView和CALayer之间的关系 我阅读了Apple文档 但它没有详细描述两者之间的关系 为什么当我添加背景图像来查看 自定义 ViewController view 时 我会得到不需要的图像黑色 当我将背景图像添加到 cus
  • TypeScript:抑制类型上不存在属性

    我在使用 TypeScript 时遇到了以下问题 有一个模块 它使用一个函数myApp common anotherFunc 来自 旧 js 代码 module myApp export module helpers export clas
  • AngularJS:隐藏 ng-message 直到点击表单提交按钮

    这是 AngularJS 1 x 中使用 ng messages 的典型示例
  • C#.NET - 如何让 typeof() 与继承一起使用?

    我将首先用代码解释我的场景 public class A public class B A public class C B public class D public class Test private A a new A privat
  • 在指令中使用 $compile 会触发 AngularJS 无限摘要错误

    关于为什么该指令会触发无限摘要错误有什么想法吗 http jsfiddle net smithkl42 cwrgLd0L 13 http jsfiddle net smithkl42 cwrgLd0L 13 var App angular