2014-11-04 3 views
1

Я новичок в angularJSнг щелкните в slickgrid форматировщиком не работает

Я использую angularJS с Ui-маршрутизатором и slickgrid я пытаюсь вызвать метод из мыши на изображение, чтобы назвать веб-службы и удалить строку

у меня есть этот контроллер:

app.controller('customerController', ['$scope', '$compile', 'CustomerService',  function ($scope, $compile, CustomerService) { 
    // function to get customers 
    $scope.getCustomers = function() { 
     CustomerService.getCustomers($("#userId").val(), $scope.getArchived).then(function (customers) { 
      dataView.beginUpdate(); 
      dataView.setItems(customers); 
      dataView.endUpdate(); 
      grid.invalidate(); 
     }, function (reason) { 
      noty({ text: reason, type: 'error' }); 
     }); 
    } 
    // function to archive customer 
    $scope.archiveCustomer = function(customerId) { 
     if (confirm(translate("LBL_DELETE_CUSTOMER_CONFIRMATION"))) { 
      CustomerService.archiveCustomer(customerId).then(function() { 
       $scope.getCustomers(); 
      }, function (reason) { 
        noty({ text: reason, type: 'error' }); 
      }); 
     } 
     return false; 
    } 

    // create grid 
    var dataView, 
     grid; 
    var options = { 
     enableCellNavigation: true, 
     enableColumnReorder: false, 
     autoHeight: true 
    }; 

    var columns = [ 
     { id: "id", name: "", field: "id", width: 20, formatter: deleteFormatter, cssClass: "centeredColumn" }, 
     { id: "customer", name: translate("Customer"), field: "customer", width: 250 } 
    ]; 

    function deleteFormatter(row, cell, value, columnDef, dataContext) { 
     html = "<img src='images/delete.gif' alt='" + translate("LBL_DELETE_CUSTOMER") + "' style='cursor:pointer;' ng-click='archiveCustomer(" + dataContext.id + ");' />"; 
     linker = $compile(angular.element(html)); 
     htmlElements = linker($scope); 
     html = htmlElements[0].outerHTML; 
     return html; 
    } 

dataView = new Slick.Data.DataView({ inlineFilters: true }); 
    grid = new Slick.Grid("#customersGrid", dataView, columns, options); 

    $scope.getCustomers(); 
}]); 

Моя проблема с нг кнопкой мыши на элементе IMG добавленной deleteFormatter. Что не так? Я видел образец с директивой, но это не ясно в моем сознании ... вы могли бы осветить меня?

Редактировать

Попробуйте с asyncPostRender без успеха: определение столбцов:

var columns = [ 
     { id: "id", name: "", field: "id", width: 20, formatter: asyncFormatter, asyncPostRender: deleteRender, cssClass: "centeredColumn" }, 
     { id: "customer", name: translate("Customer"), field: "customer", width: 250 } 
    ]; 

форматировщик и визуализации:

function asyncFormatter(row, cell, value, columnDef, dataContext) { 
    return "Data loading..."; 
} 

function deleteRender(cellNode, row, dataContext, colDef) { 
    html = "<img src='images/delete.gif' alt='" + translate("LBL_DELETE_CUSTOMER") + "' style='cursor:pointer;' ng-click='archiveCustomer(" + dataContext.id + ");' />"; 
    linker = $compile(angular.element(html)); 
    htmlElements = linker($scope); 
    $(cellNode).empty() 
    cellNode.innerHTML = htmlElements[0].outerHTML; 
} 
+0

Не могли бы вы сделать это в JSFiddler воспроизвести? –

+0

Я не знаю, как воссоздать мою среду с маршрутизатором, контроллером и представлением в JSFiddler – Troopers

+0

Слева у вас есть опция «ресурсы», поэтому вы можете добавить внешние зависимости css js. –

ответ

1

Ответ с помощью Kürşad Gulseven (Спасибо) и this post

Декларация контроллера:

app.controller('customerController', ['$scope', '$rootScope', '$compile', '$interpolate', 'CustomerService', function ($scope, $rootScope, $compile, $interpolate, CustomerService) { 

Колонки определение:

var columns = [ 
    { id: "id", name: "", field: "id", width: 20, formatter: deleteFormatter, asyncPostRender: deleteRender, cssClass: "centeredColumn" }, 
    { id: "customer", name: translate("Customer"), field: "customer", width: 250 } 
]; 

форматировщик и визуализации:

function deleteFormatter(row, cell, value, columnDef, dataContext) { 
    return "<img src='images/delete.gif' alt='delete' style='cursor:pointer;' ng-click='archiveCustomer(" + dataContext.id + ");' />"; 
} 

function deleteRender(cellNode, row, dataContext, colDef) { 
    // compile the html with angular to get ng-click with the correct scope 
    var interpolated = $interpolate($(cellNode).html())($scope); 
    var linker = $compile(interpolated); 
    var htmlElements = linker($scope); 
    $(cellNode).empty() 
    $(cellNode).append(htmlElements); 
} 

архив функции клиента:

$scope.archiveCustomer = function (customerId) { 
    if (confirm(translate("LBL_DELETE_CUSTOMER_CONFIRMATION"))) { 
     CustomerService.archiveCustomer(customerId).then(function() { 
      $scope.getCustomers(); 
     }, function (reason) { 
      noty({ text: reason, type: 'error' }); 
     }); 
    } 
} 
1

ОБНОВЛЕНО

«formatter», по-видимому, является просто функцией конфигурации заданного столбца. Вам нужно использовать функцию рендеринга для этого столбца, например «asyncPostRender». См. this example.

Ваш новый элемент (удалить img) выходит за рамки любого угла. Вам нужно скомпилировать его в Angular в событии рендеринга строки сетки.

+0

Извините, просто ошибка при перезаписи кода: у меня есть несколько двойных кавычек в моем коде. В консоли нет ошибки – Troopers

+0

Что такое живой HTML-код этого img? –

+1

Если по живому html вы скажете html произвести угловым, это: #LBL_DELETE_CUSTOMER# Troopers

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