How to call a scope method from a button displayed in ui-grid - in Angular js
Asked Answered
R

2

5

I would like to create a custom column with a link and call $scope method on ng-click. There is very similar question for ngGrid (How to call a scope method from a button displayed in ngGrid -in Angular js) and that solution works. I'm using the ui-grid, which is supposed to be just a newer version of ngGrid, but it doesn't seem to work there.

Here is my code:

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

app.controller('MainCtrl', function($scope) {  
  $scope.gridOptions = {
    data: [{name: 'test'}],
      columnDefs: [{
        field:'name', 
        displayName:'name', 
        cellTemplate: '<div ng-click="gridOptions.editUser()">Edit</div>'
      }],
      editUser: $scope.editUser
    };

  $scope.editUser = function() {
    alert('It works!');
  };
});

http://plnkr.co/edit/Q5SuIeAPFpZaUKbmIDCn

Here is the original solution for ngGrid that works: http://plnkr.co/edit/hgTQ1XdEVRyxscoNs76q

Republicanism answered 23/12, 2014 at 22:6 Comment(0)
T
3

You should declare external scope that you are going to use in cell templates using external-scopes attribute:

<div ui-grid="gridOptions" class="grid" external-scopes="gridScope"></div>

Then in controller you need to define this scope object:

$scope.gridScope = {
    editUser: function() {
        alert('It works!');
    }
}

and finally you access this external scope in template as

cellTemplate: '<div ng-click="getExternalScopes().editUser()">Edit</div>'

Demo: http://plnkr.co/edit/saYe6sddbcO76o9qBrNu?p=preview

Tillage answered 23/12, 2014 at 22:33 Comment(1)
this doesn't work anymore. See the answer from HimenVirga
W
4

In new version of ui-grid this approach does not work for me. instead i have use appScope core api. http://ui-grid.info/docs/#/tutorial/305_appScope

Warren answered 17/5, 2015 at 7:12 Comment(1)
yes, juste have to put in your template : ng-click="grid.appScope.your_function(row.entity.your_variable)Protoxylem
T
3

You should declare external scope that you are going to use in cell templates using external-scopes attribute:

<div ui-grid="gridOptions" class="grid" external-scopes="gridScope"></div>

Then in controller you need to define this scope object:

$scope.gridScope = {
    editUser: function() {
        alert('It works!');
    }
}

and finally you access this external scope in template as

cellTemplate: '<div ng-click="getExternalScopes().editUser()">Edit</div>'

Demo: http://plnkr.co/edit/saYe6sddbcO76o9qBrNu?p=preview

Tillage answered 23/12, 2014 at 22:33 Comment(1)
this doesn't work anymore. See the answer from HimenVirga

© 2022 - 2024 — McMap. All rights reserved.