2016-09-28 2 views
2

Я пытаюсь реализовать функцию afterCellEdit внутри моей функции gridOption.onREgisterApi. Я не использую $ scope в своей программе, как это рекомендуется делать в рекомендациях.Угловое: afterCellEdit без области действия

На самом деле, мой вопрос в точности такой же, как этот: question К сожалению, на него не наступают. Когда я использую null как один из вариантов ответа, я получил ошибку.

Вот код:

vm.gridOptions.onRegisterApi = function(gridApi){ 
    vm.gridApi = gridApi; 
    vm.gridApi.edit.on.afterCellEdit(null,function(rowEntity, colDef, newValue, oldValue){ 
     alert("afterCellEdit"); 
    }); 
    }; 

А вот моя ошибка:

typeError: Cannot read property '$on' of null 
at Object.feature.on.(anonymous function) [as afterCellEdit] 

Спасибо!

Edit: для @SaurabhTiwari вот мой $ scope.gridData альтернатива

function onCustomerListComplete(data) { 
    vm.gridOptions.data = data; 
} 


function OnError(reason) { 
    $log.error(reason); 
} 

function activate() { 
    customerService.getCustomerList() 
      .then(onCustomerListComplete, OnError); 
} 

vm.gridOptions = { 
    enablePaginationControls: false, 
    useExternalSorting: true, 
    enableHorizontalScrollbar : uiGridConstants.scrollbars.NEVER, 
    enableVerticalScrollbar : uiGridConstants.scrollbars.WHEN_NEEDED, 
    columnDefs: [ 
    // will be modified once the data model is set 
    { field: 'id', name: '', cellTemplate: 'content/customerList/rowEditor/customerList.rowEditor.editButton.html', width: 34 }, 
    { name: 'customerNumber', }, 
    { name: 'customerName' }, 
    { name: 'city' }, 
    { name: 'creditLimit' }, 
    { name: 'postalCode' }, 
    ] 
}; 
+0

Я не уверен, какие рекомендации вы имеете в виду. Но, на мой взгляд, здесь требуется '$ scope', чтобы« наблюдать »за изменениями в' editBox'. Из того, что вы получаете, может быть расшифровано так же, как '$ on' не может работать без' $ scope' –

+0

@SaurabhTiwari. Разработчик Angular John papa: https://github.com/johnpapa/angular-styleguide – Sherokan

+0

В этом случае, когда вы привязываете свои данные. Какова ваша альтернатива для '$ scope.gridData = {data: dataList}'. Я сомневаюсь, что vm.gridData не будет работать в этом случае. –

ответ

0

Это может быть поздно, чтобы обеспечить некоторую помощь здесь, и вы, возможно, нашли решение. Но я хотел бы объяснить ваше состояние, используя приведенный ниже код.

function (scope, handler, _this) { 
      if (scope !== null && typeof(scope.$on) === 'undefined'){ 
       gridUtil.logError('asked to listen on ' + featureName + '.on.' + eventName + ' but scope wasn\'t passed in the input parameters. It is legitimate to pass null, but you\'ve passed something else, so you probably forgot to provide scope rather than did it deliberately, not registering'); 
       return; 
      } 
      var deregAngularOn = registerEventWithAngular(eventId, handler, self.grid, _this); 

      //track our listener so we can turn off and on 
      var listener = {handler: handler, dereg: deregAngularOn, eventId: eventId, scope: scope, _this:_this}; 
      self.listeners.push(listener); 

      var removeListener = function(){ 
       listener.dereg(); 
       var index = self.listeners.indexOf(listener); 
       self.listeners.splice(index,1); 
      }; 

      //destroy tracking when scope is destroyed 
      if (scope) { 
       scope.$on('$destroy', function() { 
       removeListener(); 
       }); 
      } 


      return removeListener; 
      } 

Это оригинальный код из ui-grid Api. Вы можете найти его в библиотеке или в правильном объеме в приложении, которое вы можете просто попробовать: $scope.gridApi.edit.on.afterCellEdit.toString()

Итак, дело здесь в том, что для этой функции явно требуется область или нуль. Таким образом, вам нужно передать область этого слушателя.

Точка, о которой вы упомянули в своем вопросе, что вы не используете $scope в своем коде, несколько расплывчата. Всегда есть scope, если у вас есть контроллер. Угловое в значительной степени около scopes (по крайней мере, угловое 1 было).

В соответствии с изложенными рекомендациями вам следует избегать нагромождения всего на вашем $scope. В руководящих принципах также указывается, что вы должны использовать $scope только для прослушивания и просмотра, что в данном случае является именно здесь

Смежные вопросы