2014-08-31 46 views
2

根据这个Plunkr,在指令中使用ng-init将不会执行一个函数分配给范围内的链接,但它会如果我在控制器中。ng-init不能在指令的链接函数中工作吗?

任何人都可以解释这一点吗?

app.js

var app = angular.module('app', []); 

app.directive('linkDir', function(){ 
    return { 
    restrict: 'E', 
    scope: true, 
    template: 'Link: <p ng-init="initLink()">{{ linkmsg }}</p>', 
    link: function(scope){ 
     scope.initLink = function(){ 
     scope.linkmsg = 'link function executed' 
     } 
    } 
    }; 
}); 

app.directive('controllerDir', function(){ 
    return { 
    restrict: 'E', 
    scope: true, 
    template: 'Controller: <p ng-init="initController()">{{ controllermsg }}</p>', 
    controller: function($scope){ 
     $scope.initController = function(){ 
     $scope.controllermsg = 'controller function executed'; 
     } 
    } 
    }; 
}); 

HTML

<!DOCTYPE html> 
<html> 
    <head> 
    <link rel="stylesheet" href="style.css"> 
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.1/angular.min.js"></script> 
    <script src="script.js"></script> 
    </head> 
    <body ng-app="app"> 
    <link-dir></link-dir> 
    <controller-dir></controller-dir> 
    </body> 
</html> 

回答

9

这必须因与角度的指令是如何工作的。 scope与DOM元素之间的链接有点复杂,但要长话短说,如果使用控制器,将立即使用initController属性创建scope,而如果使用link属性,则范围将仅在之后填充它被链接到DOM元素(这意味着initLink将是undefinedng-init期间)。

为了避免这些问题,不要使用ngInit指令,对Angular's documentation如说:

唯一的适当使用ngInit的是别名特殊性质ngRepeat的 ,如演示看到下面。除了这种情况,您应该使用控制器而不是ngInit来初始化作用域上的值。

如果您需要初始化属性scope,请坚持使用控制器。

+0

我看到了,这是有道理的。我正在使用ng-init来访问一个ng表单,该表单会自动发布到作用域,但直到控制器运行后才会被填充。你对这个问题有什么建议吗? – 2014-08-31 23:38:05

+0

控制器**创建完成后,填充表单的要求是什么?你不能在控制器**被创建时填充它吗? [实施例](http://plnkr.co/edit/frVSPssQOOs1vn6auNBr?p=preview)。 – bmleite 2014-09-01 09:45:36

相关问题