当我写这样的时候,有角度的作品:
<html ng-app="mptmanager" class="ng-scope">
<body>
<input ng-model = "test" /><br />
{{test}}
</body>
</html>
<script src="js/angular.min.js"></script>
<script src="angular/angularModules.js"></script>
但是当我运行这样的JS代码时:
var temp = document.createElement('div');
temp.innerHTML = '<input ng-model = "test2"><br />{{test2}}';
document.body.appendChild(temp);
angular对新元素没有影响,所以我只能在我的页面上看到“{{test2}}”...
当我尝试使用JS添加或更改页面上的某些元素时,如何进行角度工作?
答案 0 :(得分:2)
使用Angular时,不应该在指令之外进行DOM操作。为了完成,我会告诉你如何做这项工作。只需注入$compile
服务并使用范围编译新标记。
var app = angular.module('myApp', []);
app.controller('myCtrl', function($scope, $compile) {
$scope.foo = 'Default value';
var elem = document.createElement('div');
elem.innerHTML = '<input ng-model="foo">{{foo}}';
document.body.appendChild(elem);
$compile(elem)($scope);
});
以下是使用指令的正确方法:
<div my-directive></div>
<div my-directive2></div>
<强> JavaScript的:强>
app.directive('myDirective', function() {
return {
template: '<input ng-model="foo">{{foo}}'
};
});
app.directive('myDirective2', function() {
return {
compile: function(element) {
element.html('<input ng-model="foo">{{foo}}');
}
};
});
在您的指令中,如果您使用link
函数,该函数可以访问scope
,则必须手动$compile
标记,如上所示,但要小心避免无限循环。你通常会这样做:$compile(element.contents())(scope);
如果你自己编译元素,你会创建一个无限循环。
<强> Live demos (click). 强>
答案 1 :(得分:0)
正如dskh简要提到的,directives用于在Angular中执行此类操作。
这里的问题是Angular 不知道关于新元素的,因为添加它的例程生活在Angular范围之外。您可以手动拨打$scope.$apply()
,但我不会考虑这种最佳做法。