2015-10-12 6 views
9

Я использую angularjs с ui-сеткой. Один столбец сетки содержит временную метку, которую я хотел бы отобразить как правильно отформатированную дату.Использование функции в шаблоне ячейки

До сих пор я так пробовал, но функция никогда не вызывается.

$scope.formatDate = function(date) { 
    return '42'; 
    }; 

    $scope.columns = [ 
    {field: 'date', cellTemplate: '<div class="ui-grid-cell-contents">formatDate({{row.entity.date}})</div>'}, 
    {field: 'title'}, 
    {field: 'quantity'}, 
    //[...] 
    ]; 

Вместо этого вызов функции рассматривается как строковый литерал. В результате в столбце всегда отображается formatDate(*timestamp*).

я только нашел, не удовлетворяющий способ его достижения пути определения функции на каждую отдельную строке при приеме их:

$scope.columns = [ 
    {field: 'getFormattedDate()'}, 
    //[...] 
    ]; 

    $http.post('/api/data/').success(function (data) { 
    $scope.gridOptions.data = data.elements; 

    $scope.gridOptions.data.forEach(function(row) { 
     row.getFormattedDate = function() { 
     return '42'; 
     } 
    }) 
    }); 

Все лучшее предложение?

+0

Вы пробовали [фильтр даты] (https://docs.angularjs.org/api/ng/filter/date)? – jnthnjns

+0

не используют '{{}}' для переменных функции области – charlietfl

+0

@Asok Да фильтр даты работает нормально. Извините, но вопрос на самом деле должен быть более общим, чем «как разобрать дату». Я хотел бы иметь возможность вызвать метод для других столбцов, который содержит нечто иное, чем даты. –

ответ

14

Если вы хотите получить доступ к функциям уровня видимости контроллера с помощью ui-grid вы можете использовать grid.appScope, здесь быстрый пример:

{ 
    name: 'date', 
    cellTemplate: '<div class="ui-grid-cell-contents">{{grid.appScope.parseDate(row.entity.date)}}</div>' 
} 

Полное Пример:

angular.module('myApp', ['ui.grid']) 
    .controller('myCtrl', ['$scope', function ($scope) { 

    $scope.parseDate = function (p) { 
     // Just return the value you want to output 
     return p; 
    } 

    $scope.parseName = function (p) { 
     // Just return the value you want to output 
     return p; 
    } 

    $scope.gridOptions = { 
     data: [{ 
      name: "Foo", 
      date: "2015-10-12" 
     }, { 
      name: "Bar", 
      date: "2014-10-12" 
     }], 
     columnDefs: [{ 
      name: 'name', 
      cellTemplate: '<div class="ui-grid-cell-contents">{{grid.appScope.parseName(row.entity.name)}}</div>' 
     }, { 
      name: 'date', 
      cellTemplate: '<div class="ui-grid-cell-contents">{{grid.appScope.parseDate(row.entity.date)}}</div>' 
     }] 
    }; 
}]); 

Fiddle Example

3

Для использования функции выхода вызова функции в целом, а не аргументы, должны быть обернуты в выражении брекет

<div class="ui-grid-cell-contents">{{ formatDate(row.entity.date) }}</div> 
+0

Ячейки отображаются пустыми. 'Console.log()' в '$ scope.formatDate' показывает, что функция не вызывается. Но я не вижу никаких ошибок в консоли. –

+0

создайте директиву, область внутри сетки не будет вашей областью контроллера. – charlietfl

+1

Вам нужно {{сетка.appScope.formatDate (row.entity.date)}} –

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