My question is very simple, I just want to pass a controller function to directive. In other terms, I just want to call a controller function from directive.
var myapp =angular.module('myapp',[]);
myapp.controller('myCtrl',['$scope','$timeout',function($scope,$timeout){
$scope.fnItemsOnAdded = function(itms){
alert('Hi, I am in controller add. Here are your Items: '+JSON.stringify(itms));
}
$scope.fnItemsOnCancel = function(itms){
alert('Hi, I am in controller cancel. Here are your Items: '+JSON.stringify(itms));
}
}]);
myapp.directive('myPicker',['$timeout',function($timeout){
var dtv={};
dtv.template = '<li ng-repeat="itm in ngModel.ItemsList"><label><input type="checkbox" ng-model="itm.IsSelected" />{{itm.Name}}</label></li>';
dtv.template += '<a href="javascript:void(0)" ng-click="addItems()" class="addItems">add items</a>';
dtv.template += '<a href="javascript:void(0)" ng-click="cancelItems()" class="cancel">cancel</a>';
dtv.scope = { postUrl: '@', jsonadd: '&', jsoncancel: '&' };
dtv.restrict = 'A';
dtv.link = function($scope,elm,attrs){
$scope.ngModel={};
$scope.ngModel.SelectedKeys=[];
$timeout(function(){
$scope.ngModel.ItemsList = [
{Name:"Item1",IsSelected:false},
{Name:"Item2",IsSelected:false},
{Name:"Item3",IsSelected:false},
{Name:"Item4",IsSelected:true},
{Name:"Item4",IsSelected:false},
];
},100);
$scope.addItems = function(){
//Dummy logic to update SelectedKeys
for(var idx =0;idx<$scope.ngModel.ItemsList.length;idx++){
if($scope.ngModel.ItemsList[idx].IsSelected){
$scope.ngModel.SelectedKeys.push($scope.ngModel.ItemsList[idx]);
}
}
alert("i'm in directive add. Lemme call parent controller");
$scope.jsonadd($scope.ngModel.SelectedKeys);
}
$scope.cancelItems = function(){
alert("i'm in directive cancel. Lemme call parent controller");
$scope.jsonadd($scope.ngModel.SelectedKeys);
}
}
return(dtv);
}]);
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="myapp" ng-controller="myCtrl">
<div class="jqmWindow" id="myPickListDiv" my-picker jsonadd="fnItemsOnAdded" jsoncancel="fnItemsOnCancel" post-url="/myurl"></div>
</div>
Can anybody please help me where I'm going wrong here. I believe it has got something to do with $scope inheritance or convention.
I know I am doing some petty mistake here, just that I am can't figure it in the rush I am.
Thank you very much for you help!
You're almost there. The syntax for passing params is a little strange.
In your HTML, use something like
<div my-picker jsonadd="fnItemsOnAdded(items)"...
and in your directive...
$scope.jsonadd({items: $scope.ngModel.SelectedKeys})
The keys in the object passed to the isolate scope function (jsonadd
, jsoncancel
) need to match the argument names used in the attribute.
I don't know where SelectedKeys
comes from but I assume you've just omitted something for brevity.
Collected from the Internet
Please contact [email protected] to delete if infringement.
Comments