2015-08-22 57 views
1

我想定義控制器,並要求在指令上。事情是這樣的:如何訪問這兩個要求:'ngModel'和控制器屬性上的指令

return { 
    controller: 'ValidateElementCtrl as validate', 
    require: 'ngModel', 
    scope: { 
     ngModel: '=' 
    }, 
    link: link 
}; 

現在無論是定義控制器時,或需要NG模式,在鏈接功能你只有到第四個參數的訪問。我知道第四個參數可以是一個對象幷包含多個控制器等等,但是當您將控制器定義爲數組時,情況就是如此。

這是我有什麼,我不知道如何訪問控制器,我獲得所需的ngModel作爲第四個參數:

function link(scope, element, attrs, ctrlGetsNgModel) { 
    console.log(ctrlGetsNgModel) // Returns the ngModel, no sign on the controller 
} 

我知道我可以在一個指令定義控制器和作爲一個範圍屬性傳遞它,但在這種情況下,我想定義一個控制器來處理驗證和類似的指令,並且該控制器只被分配給這個指令。

編輯: 找到一種方法,如何做到這一點: 兼得ngModel和控制器的連接功能,您可以控制分配到模板是這樣的:

然後定義範圍訪問到someDirectiveName:'=',並且您可以訪問控制器作用域控制器的指令作用域`scope.someDirectiveName'= <。

+0

我覺得你很迷惑,'ctrlGetsNgModel'不能模型。你能否提供完整的指令代碼及其用法? – dfsq

回答

1

不完全確定你想達到什麼,但我不認爲你可以把'controller as'放在類似於指令定義的字符串中。使用controllerAs屬性,所以是這樣的:

return { 
    // ... 
    controller: controller, 
    controllerAs: 'validate' 
    // .... 
}; 

你會也使用bindToController: true如果要訪問上的分離範圍內定義的任何屬性。但我不確定你是否需要隔離範圍..

你能說清楚你的實際目標是什麼嗎?這是你的目標?

DEMO

HTML

<body ng-controller="MainCtrl"> 
    <foo ng-model="someModel"></foo> 
</body> 

JS

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

app.controller('MainCtrl', function($scope) { 
    // the element on which you apply the directive will need to have a model 
    // defined if you use `require: 'ngModel'` 
    $scope.someModel = {modelValue: 'blah'}; 
}); 


app.directive('foo', function(){ 
    return { 
    controller: controller, 
    controllerAs: 'validate', 
    template: '<div>{{validate.someProp}}</div>', 
    require: 'ngModel', 

    link: link 

    }; 

    function controller(){ 
    this.someProp = 'bar'; 
    } 

    function link(scope, element, attrs, ctrlGetsNgModel) { 
     console.log('ctrlGetsNgModel',ctrlGetsNgModel) // Returns the ngModel, no sign on the controller 
    } 

}); 
+0

使用'bindToController:true'會是我認爲正確的解決方案 –

0

假設你的指令的名稱是 「validateField」,那麼你可以傳遞一個數組是這樣的:

return { 
    controller: controller, 
    controllerAs: 'validate', 
    require: ['ngModel', 'validateField'], 
    scope: { 
     ngModel: '=' 
    }, 
    link: link 
}; 

然後在鏈接函數中,第四個參數將是一個包含ngModel控制器和指令控制器的數組。

function link(scope, element, attrs, ctrlArray) { 
    console.log(ctrlArray[0]) // Returns the ngModel controller 
    console.log(ctrlArray[1]) // Returns your controller 
} 
相關問題