2013-09-09 3 views
1

У меня есть настройка углов следующим образом, пытаясь имитировать некоторые функции excel, где у меня есть контроллер, вложенный внутри ng-repeat.Проблема с вызовом функции Angularjs с вложенными элементами

<tr ng-repeat="lw in lw_list" my-lw ng-model="lw" 
<td> 
     <!-- next two elements act as an excel cell, one for inputing data, they other for displaying calcualtion result --> 
     <div ng-controller="MyCellCtrl"> 
      <input type="text" class="inputdiv" ng-model="lw.library.name" >in</input>       
      <div class="output" ng-bind="getCellValue(lw.library.name)" syle="postion:absolute" contenteditable="True" >out</div> 
     </div> 


     <div ng-controller="MyCellCtrl"> 
      more input/div pairs to act as a new cell  
      ..... 
     </div> 

</td> 

У меня есть таблицы стилей, установленных таким образом, что вход и выход находится в том же положении, и получить скрытые/нескрываемый, так что они действуют как клетку первенствовать (вы вводите формулу, а затем, когда вы покидаете фокус, он обновляет содержимое).

В любом случае, когда я помещаю console.log() внутри функции getCellValue(), чтобы показать, какой экземпляр контроллера вызывается, а затем введя одну конкретную ячейку, я вижу, что вызов getCellValue() на каждую ячейку.

Есть ли способ вызвать getCellValue() при обновлении ввода без вызова метода на каждом экземпляре?

(я на основе этого кода на код из этого урока:. https://github.com/graunked/spreadsheet вы можете увидеть такое же поведение, поставив console.log в функции вычислительной Если увеличить массивы до 20 х 20 элементов, он начинает замедлитесь при вводе чего-либо.)

ответ

0

Есть ли способ вызвать getCellValue() при обновлении ввода без вызова метода на каждом экземпляре?

<div class="output" ng-bind="foo"> 

затем использовать $watch:

function MyCellCtrl($scope) 
    { 
    $scope.foo = $scope.lw.library.name; 

    $scope.$watch('foo', function(newValue) { 
    $scope.foo = getCellValue($scope.foo); 
    }); 
    } 

или использовать viewChangeListeners в качестве альтернативы:

function MyCellCtrl($scope) 
    { 
    $scope.foo = $scope.lw.library.name; 

    this.$viewChangeListeners.push(function(newValue) { 
    $scope.foo = getCellValue($scope.foo); 
    }); 
    } 

Ссылки