Init上的AngularJS DOM访问

Init上的AngularJS DOM访问,angularjs,Angularjs,我编写了这个简单的JSFIDLE,其中我(成功地)在ng repeat中对一个指令执行了一些基本的addClass 现在,我的问题是:哪一个是执行此类DOM操作的最佳(或预期)位置: A.在指令中? B.在控制器中? 这两种可能性都在我的示例中显示 代码: var TestApp = angular.module("TestApp", ['ngResource']); TestApp.directive('onLoad', function() { return { r

我编写了这个简单的JSFIDLE,其中我(成功地)在ng repeat中对一个指令执行了一些基本的addClass

现在,我的问题是:哪一个是执行此类DOM操作的最佳(或预期)位置:

A.在指令中?

B.在控制器中?

这两种可能性都在我的示例中显示

代码:

var TestApp = angular.module("TestApp", ['ngResource']);
TestApp.directive('onLoad', function() {
    return {
        restrict: 'A',
        link: function(scope, elm, attrs) {
            elm.addClass('loaded'); // A: DOM manipulation in directive
            scope.initMe(scope.$eval(attrs.onLoad2), elm); // B: DOM manipulation handled in controller
        }
    };
});

提前感谢:)

永远不要操作控制器内部的dom

控制器应该只使用服务并更新$scope的属性。所有DOM操作都应该通过指令和(在某些情况下)服务(例如

参见angularjs的概念

更新:正确方式的示例

设置类loaded2的更“角度方式”如下所示(这避免了控制器内部的DOM操作):

在HTML中,为类(myClass)声明一个模型:

在控制器中,操纵model/$scope属性:

$scope.initMe = function() {
   $scope.myClass = "loaded2";
}
更改模型/范围将自动更新视图


如果要在HTML中声明一个类由$scope属性myClass控制,则此方法非常有用。但是,在链接函数中使用elm.addClass()更独立,更易于维护(我更喜欢这种方法)。

好的,谢谢您的回复。虽然我知道angularjs的医生,但这是我不知道的事情(但怀疑是这样)。如果你不介意,请在你的答案中添加一个正确的方法,这样其他人也可以了解我的问题。我已经用指导性的方法更新了示例。关于
绑定(“load”
,如果您希望DOM在创建后触发它,那么是多余的,因为要附加一个事件,它需要已经创建好(并且在link函数中它已经插入到页面中)。但是如果是由jquery插件或其他东西触发的自定义事件,那么它是有意义的(请记住范围。$apply)。谢谢你的回复。我的目的不是设置类,我知道这是我选择的一个糟糕的例子。^^。我的目的是在了解模型的同时操作dom。(我初始化了一个jquery图像上传插件)。总之,我在指令中完成了这项工作。
scope.initMe()
$scope.initMe = function() {
   $scope.myClass = "loaded2";
}