2014-08-31 47 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

相關問題