2012-10-18 76 views
53

我有一个outerItems列表。在每个outerItem中,我有一个innerItems列表。它们是动态分类的。如何在AngularJS控制器中获取当前作用域DOM元素?

当鼠标光标指向innerItems之一时,我必须在innerItem元素上方显示弹出窗口。

Popup div是身体的孩子,因为我不想为每个innerItems单独弹出。

我看到它的方式 - 在ng-mouseover我调用函数,设置左/顶部属性到我绝对定位的弹出。因此,对于每个innerItems,我想调用jQuery .offset()方法,该方法使页面左上角的左/顶部值。

那么我怎样才能获得当前范围元素的jQuery对象?或者,如果我选择了错误的方式

回答

69

在控制器:

function innerItem($scope, $element){ 
    var jQueryInnerItem = $($element); 
} 
+44

你选择了错误的方式。不要在控制器中访问$元素。您需要将其封装为Popup指令,然后将弹出窗口放入HTML中。 – ganaraj

+1

为什么访问控制器中的$元素是错误的? –

+11

它违背了角度的无控制操纵的口头禅。保持代码解耦,允许更简单的测试,并保持所有dom操作代码的声明和模板。 这就是说,有时你需要的元素。例如,浏览器自动完成字段填充输入,但不会触发ng_model更新。在这些情况下,你需要输入$(el).val()。 – hurshagrawal

8

更好的和正确的解决办法是有一个指令。范围是相同的,无论是在指令的控制器还是主控制器。使用$element来执行DOM操作。指令控制器中定义的方法可在主控制器中访问。

例如,当发现一个子元素:

var app = angular.module('myapp', []); 
app.directive("testDir", function() { 
    function link(scope, element) { 

    } 
    return { 
     restrict: "AE", 
     link: link, 
     controller:function($scope,$element){ 
      $scope.name2 = 'this is second name'; 
      var barGridSection = $element.find('#barGridSection'); //helps to find the child element. 
    } 
    }; 
}) 

app.controller('mainController', function ($scope) { 
$scope.name='this is first name' 
}); 
+1

问题是如何在dom中获取html。那么如何通过id从某个dom元素获得html控制器字符串呢? – fdrv

+0

我已经投下了这个答案,因为它不是发布问题的答案。 – drdrej

相关问题