- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我有一个遗留应用程序,它通过 jQuery 将一些内容插入到 DOM 中。我希望代码库的遗留部分负责编译插入到 DOM 中的 html。
我可以使用 $compile
让它编译初始 html,但是任何由指令的模板或 templateUrl 添加的 DOM 元素都不会被编译,除非我调用 $scope.$apply( )
来自指令本身。
我在这里做错了什么?
fiddle 链接: http://jsfiddle.net/f3dkp291/15/
index.html
<div ng-app="app">
<debug source='html'></debug>
<div id="target"></div>
</div>
application.js
angular.module('app', []).directive('debug', function() {
return {
restrict: 'E',
template: "scope {{$id}} loaded from {{source}}",
link: function($scope, el, attrs) {
$scope.source = attrs.source
if( attrs.autoApply ) {
// this works
$scope.$apply()
}
},
scope: true
}
})
// mimic an xhr request
setTimeout(function() {
var html = "<div><debug source='xhr (auto-applied)' auto-apply='1'></debug><br /><debug source='xhr'></debug></div>",
target = document.getElementById('target'),
$injector = angular.injector(['ng','app']),
$compile = $injector.get('$compile'),
$rootScope = $injector.get('$rootScope'),
$scope = angular.element(target).scope();
target.innerHTML = $compile(html)($scope)[0].outerHTML
// these do nothing, and I want to compile the directive's template from here.
$scope.$apply()
$scope.$root.$apply()
angular.injector(['ng','app']).get('$rootScope').$apply()
}, 0)
输出
scope 003 loaded from html
scope 005 loaded from xhr (auto-applied)
scope {{$id}} loaded from {{source}}
更新:解决方案适用于具有模板属性的指令,但不适用于 templateUrl
所以,我应该一直在编译 dom 节点,而不是 HTML 字符串。但是,如果指令包含 templateUrl,则此更新的 fiddle 会显示相同的失败行为:
最佳答案
您可能已经意识到,您需要调用 $scope.$apply()
来更新范围值中的 {{bindings}}
。
但是您不能在异步函数中执行此操作的原因是您正在针对 #target
的现有范围编译 HTML,但随后试图仅附加 HTML。这是行不通的,因为您需要在 DOM 中包含已编译节点,方法是使用 jQuery 的 .append()
或类似方法附加整个已编译节点,或者通过设置 DOM innerHTML
首先,然后编译 DOM 中的节点。之后,您可以在该作用域上调用 $apply
,因为该指令已编译并位于 DOM 中,所以它会正确更新。
换句话说,按如下方式更改您的异步代码。
代替:
target.innerHTML = $compile(html)($scope)[0].outerHTML
$scope.$apply()
将其更改为:
target.innerHTML = html;
$compile(target)($scope);
$scope.$digest();
请注意,我执行的是 $digest()
而不是 $apply()
。这是因为 $apply()
从 $rootScope
开始对每个范围进行摘要。您只需要消化链接的那个范围,因此消化那个范围就足够了(而且速度更快,对于任何具有大量范围的合理大小的应用程序)。
我刚刚检查过,OP 实际上是正确的,假设 Angular 可以很好地编译 HTML 字符串或分离的 DOM 节点。但是您需要做的是确保将编译后的 node 实际附加到 DOM,而不仅仅是 HTML。这是因为 Angular 在 DOM 节点* 上将诸如作用域和绑定(bind)信息之类的东西存储为 jQuery/jQueryLite 数据。因此,您需要将额外的信息附加到整个节点,以便 $digest()
能够正常工作。
因此,进行这项工作的另一种方法是将 OP 代码的相同部分更改为:
target.appendChild($compile(html)($scope)[0]);
$scope.$digest()
* 从技术上讲,它存储在内部 jQuery 数据缓存中,缓存键存储在 DOM 节点本身。
关于javascript - AngularJS:在包含带有 templateurl 的指令的 html 上使用 $compile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27008280/
我在运行 compile test:compile it:compile经常并且...希望将击键次数减少到类似 *:compile 的数量。 .不过,它似乎不起作用。 $ sbt *:compile
有人可以给我这个问题的提示(或整个解决方案!): 在 Clojurescript 项目中,如何自动将编译日期/时间硬编码在符号中,以便在使用应用程序时显示? 谢谢。 最佳答案 有多种解决方案: 使用l
我是 ember.js 框架的新手,使用 ruby on rails 和 ember.debug.js -v 1.10.1(最新版本)。我一直在网上看到 ember 更改了这个最新的补丁,但我不知
我不是 Fortran 程序员(只是短暂的经验),但我需要编译一个部分用 F77 编写的程序。在我之前有人用 Absoft 编译器编译过它,但现在我需要在另一台机器上用 g77 重复这个过程。对于 A
我运行命令 mvn clean package 我得到了上面的错误我的 pom 是: http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0
我有以下问题。 我想在测试编译阶段排除一些.java文件(** / jsfunit / *。java),另一方面,我想在编译阶段包括它们(id我使用tomcat启动tomcat:运行目标) ) 我的p
符合 wikipedia A compiler is a computer program (or set of programs) that transforms source code writt
我想构建项目,但出现如下错误: 无法执行目标 org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile
当我通过右键单击项目名称进行 Maven 安装时,出现以下错误: [INFO] Scanning for projects... [WARNING] [WARNING] Some proble
我是 Maven 的新手,我想将我的应用程序导入到 Maven。和以前一样,我想将我的 ejb 项目中的类引用到我的 war 项目中。我在类中没有错误,但是如果我在我的父项目上安装 maven,那么我
当我将 ASP.NET Web 应用程序部署到生产环境时,我使用配置转换来删除 debug="true"来自 .但是,就在今天,我注意到 web.config 中的另一个部分如下所示:
This question already has answers here: Maven Compilation Error: (use -source 7 or higher to enable
我正在使用 Maven 3.0.5 和 Spring Tool Source 3.2 并安装了 Maven 插件。当我尝试执行“运行方式---> Maven 安装”时,出现以下错误: [INFO] S
我试图用 AngularJS 创建我自己的递归指令,它调用自己以漂亮的 JSON 格式转换 View 中的对象。好吧,首先我使用 ng-include 调用带有模板的脚本,在其中使用 ng-if 验证
可以通过 @suppress annotation使用Google的Closure Compiler在每个文件的基础上禁止显示警告。但是,似乎无法同时抑制多个警告-例如globalThis和check
假设一个拥有 10 到 20 年经验的熟练开发人员从未构建过编译器或模拟器,哪一个会更具挑战性? 你能比较一下会成为障碍的问题吗? 谢谢。 最佳答案 仿真和编译是完全不同的,但由于两者都被认为是“低级
最近发现Vim中有一个命令叫compiler。您可以使用任何常见的编译器(例如,:compiler gcc、:compiler php 等)来调用它,但它似乎没有任何立竿见影的效果。 我在联机帮助页上
我试图从 spring.io 指南中部署最简单的应用程序 Guide 但是我有一些麻烦.. 我做了什么: 创建的项目。 (来自 spring.io 教程) 下载 heroku CLI 在 Intell
每当进行 Maven Build..>clean install 时,我都会遇到此错误。我尝试过使用不同版本的插件并添加 testFailureIgnore 属性,但问题仍然存在。请找到下面的 POM
我有一个 web 应用程序,我尝试使用 maven 进行编译,不幸的是,在执行 mvn clean package 时它不起作用。 stackoverflow 上有很多问题看起来都一样,但没有解决了我
我是一名优秀的程序员,十分优秀!