Search code examples
javascriptangularjsangularjs-controllerangularjs-controlleras

Change a value inside ng-repeat cycle with ng-click


I want to change a value of an item inside an ng-repeat cycle using a function.

This for example won't work.

HTML

<ul class="unstyled">
  <li ng-repeat="todo in todoList.todos">
      <span>{{todo.name}}</span>
      <button ng-click="example(todo)">Change me</button>
  </li>
</ul>

JS

$scope.example = function(v) {
  v.name = 'i am different now';
};

Full example

http://plnkr.co/edit/kobMJCsj4bvk02sveGdG


Solution

  • When using controllerAs pattern, you should be using controller alias while accessing any variable from controller function. But that should be bounded to this context of controller.

    <button ng-click="todoList.example(todo)">Click me</button>
    

    Demo Here

    Extended

    Also keep in mind while using this keyword inside a controller factory function. You should assign this variable to some variable to ensure that this which you are using is not other this, look at this context related issue.

    angular.module('todoApp', [])
      .controller('TodoListController', function() {
        var toList = this;
        toList.todos = [{name:'test 1'},{name:'test 2'}];
        toList.example = function(v) {
          v.name = 'ora bene';
        };
      });