Angularjs 无法从角度UI模式内的id获取元素
我有一个AngularJS应用程序,带有AngularUI模式。我想从控制器中检索模式HTML中定义的DOM元素,但它返回了Angularjs 无法从角度UI模式内的id获取元素,angularjs,angular-ui,Angularjs,Angular Ui,我有一个AngularJS应用程序,带有AngularUI模式。我想从控制器中检索模式HTML中定义的DOM元素,但它返回了undefined 我在Plunker()中上传了我的代码 在ModalInstanceCtrl控制器中,如果我试图检索在模态模板中定义的元素myElem,它会给我一个未定义的异常,如下所示,但如果我对var elem=$document.getElementById('myElem')进行注释,则效果良好 TypeError:undefined不是函数 在纽约(http:
undefined
我在Plunker()中上传了我的代码
在ModalInstanceCtrl
控制器中,如果我试图检索在模态模板中定义的元素myElem
,它会给我一个未定义的异常,如下所示,但如果我对var elem=$document.getElementById('myElem')进行注释,则效果良好代码>
TypeError:undefined不是函数
在纽约(http://run.plnkr.co/K8SndGsk5DANhGl2/:36:28)
在调用时(http://cdnjs.cloudflare.com/ajax/libs/angular.js/1.2.20/angular.js:3918:17)
在Object.instantiate(http://cdnjs.cloudflare.com/ajax/libs/angular.js/1.2.20/angular.js:3929:23)
在http://cdnjs.cloudflare.com/ajax/libs/angular.js/1.2.20/angular.js:7216:28
一帆风顺(http://cdnjs.cloudflare.com/ajax/libs/angular-ui-bootstrap/0.10.0/ui-bootstrap-tpls.js:1710:32)
在wrappedCallback(http://cdnjs.cloudflare.com/ajax/libs/angular.js/1.2.20/angular.js:11498:81)
在http://cdnjs.cloudflare.com/ajax/libs/angular.js/1.2.20/angular.js:11584:26
在范围内。$eval(http://cdnjs.cloudflare.com/ajax/libs/angular.js/1.2.20/angular.js:12608:28)
在范围内。$摘要(http://cdnjs.cloudflare.com/ajax/libs/angular.js/1.2.20/angular.js:12420:31)
在范围内。$apply(http://cdnjs.cloudflare.com/ajax/libs/angular.js/1.2.20/angular.js:12712:24)
我在下面的代码中遗漏了什么吗
谢谢,事实上应该是这样的
var elem = document.getElementById('myElem');
而不是
var elem = $document.getElementById('myElem');
删除$sign。它将打开模式窗口。正如您所说,DOM是在控制器执行后构建的。尝试将$timeout注入模式控制器,并将$timeout设置为0。您不应该访问控制器中的DOM元素。如果需要访问DOM元素,应该使用指令,可以是内置指令,也可以是自定义指令。更笼统地描述你想要实现的目标。从您提供的链接来看,从控制器访问DOM是一件坏事,因为理论上控制器永远不会知道DOM。但是我想知道为什么下面的代码失败了。看起来控制器是在创建DOM之前被调用的。实际上,在控制器中进行DOM操作是不好的有很多原因。1使您无法独立于视图测试控制器,2使您不清楚从HTML的角度操作视图的内容,3使您的控制器无法轻松地与其他视图一起重复使用,真的列表还在继续。在控制器之间共享数据的解决方案是使用服务或工厂。它可以打开模式窗口,但我需要的是检索DOM。我更新了代码,它返回了elem
的null
。看起来DOM是在控制器执行后构造的。@ShaunXu:控制器应该只包含业务逻辑。而不是DOM操作。是的,在创建DOM之前调用控制器。使用指令来封装手动DOM操作。也许可以详细介绍一下该函数?
$scope.openModal = function () {
var modal = $modal.open({
animation: false,
templateUrl: 'app/modules/demo/modal.html',
controller: 'MyModalCtrl',
resolve: {
vm: function () {
return 'id';
}
}
});
modal.rendered.then(function () {
//process your logic for DOM element
console.info(document.getElementById('elementIdInModalTemplate');
});
$scope.openModal = function () {
var modal = $modal.open({
animation: false,
templateUrl: 'app/modules/demo/modal.html',
controller: 'MyModalCtrl',
resolve: {
vm: function () {
return 'id';
}
}
});
modal.rendered.then(function () {
//process your logic for DOM element
console.info(document.getElementById('elementIdInModalTemplate');
});