Angularjs 无法从角度UI模式内的id获取元素

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:

我有一个AngularJS应用程序,带有AngularUI模式。我想从控制器中检索模式HTML中定义的DOM元素,但它返回了
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');
  });