2016-12-29 129 views
0

雖然以前有人問過這個問題,但它不適用於我。控制器變量「myVar」在鏈接函數被調用之前設置。根據文檔和其他帖子,myVar應該在鏈接功能中可用,但事實並非如此。實際上,鏈接作用域包含一個父控制器引用,但沒有引用它自己的控制器?有任何想法嗎?AngularJS訪問指令控制器變量的指令鏈接功能

angular.module('app.main') 
    .directive('myWidget', MyWidget) 
    .controller('MyWidgetCtrl', MyWidgetCtrl) 

function MyWidget() { 
    return { 
     restrict: 'E', 
     templateUrl: 'my-widget-tmpl.html', 
     controller: MyWidgetCtrl, 
     link: function (scope, element, attrs) { 
      var test = false; 
      test = myVar; // doesn't work 
      test = scope.myVar; // doesn't work 
      test = scope.vm.myVar; // doesn't work 
     } 
    }; 
} 

MyWidgetCtrl.$inject = ['$scope']; 
function MyWidgetCtrl($scope) { 
    var vm = this; 
    vm.myVar= true; 
} 

回答

1

你在這裏混合兩種方法。在您的控制器中,您將的東西放在控制器實例上。只要你在你的指令定義中指定了bindToController: true,它就可以正常工作。無論如何,這被認爲是最佳做法,原因有幾個。

鏈接函數中的問題是,您期望變量位於作用域上,但事實並非如此。它在控制器上,在範圍內。您。然而,鏈接功能的第四注射是的指令控制器,這樣你就可以像這樣訪問:

link: function(scope, element, attrs, ctrl) { 
    var test = false; 
    test = ctrl.myVar; 
} 

在這唯一的打嗝是,如果你require其他指令,那麼你也必須reqire你自己的指令控制器(我認爲),而不是單個控制器,您將在鏈接功能中獲得控制器的array而不僅僅是一個。如果您從未使用過require,請不要擔心我剛纔所說的內容,但請將其放在後面,以防您想要使用require

編輯:以上信息仍然是相關的,而且很可能對你有好處閱讀,但它只是發生,我認爲你真的做才能讓你的代碼工作是添加bindToController: truecontrollerAs: 'vm'。這是你唯一缺少的兩件事。

+0

是的,這對我工作,在編輯中使用你的建議,thx – nuander

1

您應該將變量綁定在MyWidgetCtrl的$scope

MyWidgetCtrl.$inject = ['$scope']; 
function MyWidgetCtrl($scope) { 
    $scope.myVar = true; 
} 

否則,你應該使用bindToController方式,跳過$scope的使用。

+0

如果他想訪問他的控制器的鏈接功能,但他需要使用'bindToController' *和*'controllerAs'來命名它將綁定的變量在範圍內,對嗎? –

+0

然後,可以從鏈接函數'ctrls'中的第四個屬性訪問該指令的控制器對象,如'var hisCtrl = ctrls [0];' – tomepejo

+0

是的,但是如果他使用DDO。我認爲只要將其命名並將其放在範圍內就比較容易。無論如何,這是發生了什麼,我相信。 –

相關問題