Использование вспомогательных методов при создании шаблонов с помощью Angular JS

В настоящее время находится в процессе преобразования веб-сайта из предыдущего шаблона в Angular. В предыдущем процессе шаблонизации, который мы использовали, мы могли вызывать вспомогательные методы для правильного отображения данных. Например:

<script type="text/javascript">
$.views.helpers({
    parseDate: function (jsonDate) {
      if (jsonDate != null) {
        var newDate = Utils.PrettyDate(Utils.ConvertJsonDateToJsDate(jsonDate));
        return newDate;
      }
    }
});
</script>


<div class="post-info">
  <span class="posted-date">Posted {{ :~parseDate(CreatedDate) }}</span>
  &nbsp|&nbsp
  <span>{{ :ReplyCount }} Replies</span>
</div>

Это было очень приятно. Попытка найти способ использовать тот же тип функциональности с Angular, что касается шаблонов. Можно ли сделать что-то подобное? Если да, то как?


person yaegerbomb    schedule 17.09.2012    source источник


Ответы (3)


Вы просто добавляете метод в свой контроллер. Что-то вроде этого:

<div class="post-info" ng-controller="MyCtrl">
    <span class="posted-date">Posted {{parseDate(CreatedDate)}}</span>
</div>

Затем контроллер:

function MyCtrl($scope)
{
     $scope.parseDate = function(jsonDate) {
        //date parsing functionality
        return newParsedDate;
     }
}
person dnc253    schedule 17.09.2012

Если вас интересует только отображение данных, то, как уже упоминалось в pkozlowski.opensource, фильтры — это «угловой способ» форматирования данных для отображения. Если существующего фильтра дат недостаточно, я предлагаю собственный фильтр. Тогда ваш HTML будет выглядеть более «угловатым»:

<span class="posted-date">Posted {{CreatedDate | dateFormatter}}</span>

Приведенный выше синтаксис дает понять, что вы (только) форматируете.

Вот пользовательский фильтр:

angular.module('OurFormatters', []).
 filter('dateFormatter', function() {               // filter is a factory function
   return function(unformattedDate, emptyStrText) { // first arg is the input, rest are filter params
       // ... add date parsing and formatting code here ...
       if(formattedDate === "" && emptyStrText) {
            formattedDate = emptyStrText;
       }
       return formattedDate;
   }
 });

Инкапсулируя наши фильтры/форматеры в модуль, их также проще (повторно) использовать в нескольких контроллерах — каждый контроллер, который в них нуждается, просто внедряет OurFormatters.

Еще одним преимуществом фильтров является то, что они могут быть объединены в цепочку. Поэтому, если когда-нибудь вы решите, что в некоторых местах вашего приложения пустые даты не должны ничего показывать (быть пустыми), тогда как в других местах вашего приложения пустые даты должны показывать «TBD», фильтр может решить последнее:

<span class="posted-date">Posted {{CreatedDate | dateFormatter | tbdIfEmpty}}</span>

Или ваш пользовательский фильтр может принимать один или несколько аргументов (приведенный выше пример поддерживает аргумент):

<span class="posted-date">Posted {{CreatedDate | dateFormatter:'TBD'}}</span>
person Mark Rajcok    schedule 18.09.2012

Глядя на представленный вариант использования, лучше всего использовать фильтр даты, описанный здесь: http://docs.angularjs.org/api/ng.filter:date Используя этот фильтр, вы можете написать:

{{CreatedDate | date}}

Упомянутый фильтр настраивается, поэтому вы можете использовать разные форматы даты и т. д.

Вообще говоря, фильтры очень удобны для инкапсуляции логики форматирования/вспомогательных функций пользовательского интерфейса. Подробнее о создании фильтров здесь: http://docs.angularjs.org/guide/dev_guide.templates.filters.creating_filters

Фильтры хороши и подходят для многих случаев использования, но если вы просто после использования какой-либо функции в своем шаблоне, это возможно. Просто определите функцию в области видимости, и вы готовы использовать ее прямо в своем шаблоне:

{{doSomething(CreatedDate)}}

где doSomething необходимо определить в области (текущей или одной из родительских областей):

function MyCtrl($scope) {

    $scope.doSomthing = function(argument){
        //ui helper logic here
    }    
}
person pkozlowski.opensource    schedule 17.09.2012
comment
Сначала я пытался использовать фильтр. Проблема в том, что модель возвращает /Date(jsondatestring), а не только числа, из которых состоит дата. Вот почему мне было интересно, есть ли способ использовать функцию. Спасибо, поскольку вы предоставили оба. - person yaegerbomb; 18.09.2012
comment
Реализован подход фильтра; Очень чистый. Спасибо! - person Benoit; 26.10.2014