Eu postei a mesma pergunta de forma diferente, mas ninguém respondeu. Eu não estou conseguindo uma imagem clara do que os Formatadores e Analistas fazem em js angulares.
Pela definição, tanto os formatadores quanto os analisadores são parecidos comigo. Talvez eu esteja errado, pois sou novo nessa angular.
Matriz de funções a serem executadas, como um pipeline, sempre que o valor do modelo for alterado. Cada function é chamada, por sua vez, passando o valor para o próximo. Usado para formatar / converter valores para exibição no controle e validação.
Matriz de funções para executar, como um pipeline, sempre que o controle ler valor do DOM. Cada function é chamada, por sua vez, passando o valor para o próximo. Usado para higienizar / converter o valor, bem como a validação. Para validação, os analisadores devem atualizar o estado de validade usando $ setValidity () e retornar undefined para valores inválidos.
Por favor, ajude-me a entender os dois resources com um exemplo simples. Uma ilustração simples de ambos será apreciada.
Este tópico foi abordado muito bem em uma questão relacionada: Como fazer filtragem bidirecional no AngularJS?
Para resumir:
Aqui está um exemplo simples, construindo um exemplo na documentação da API NgModelController :
//format text going to user (model to view) ngModel.$formatters.push(function(value) { return value.toUpperCase(); }); //format text from the user (view to model) ngModel.$parsers.push(function(value) { return value.toLowerCase(); });
Você pode vê-lo em ação: http://plnkr.co/UQ5q5FxyBzIeEjRYYVGX?plnkr=legacy
Quando você digita um nome em (view to model), você verá que o modelo está sempre em minúsculas. Mas, quando você clica em um botão e programaticamente altera o nome (modelo para exibição), o campo de input é sempre maiúsculo.
Outro uso para formatadores e analisadores é quando você deseja armazenar datas em hora UTC e exibi-las na hora local em inputs, criei a diretiva datepicker abaixo e o filtro utcToLocal para isso.
(function () { 'use strict'; angular .module('app') .directive('datepicker', Directive); function Directive($filter) { return { require: 'ngModel', link: function (scope, element, attr, ngModel) { element.addClass('datepicker'); element.pickadate({ format: 'dd/mm/yyyy', editable: true }); // convert utc date to local for display ngModel.$formatters.push(function (utcDate) { if (!utcDate) return; return $filter('utcToLocal')(utcDate, 'dd/MM/yyyy'); }); // convert local date to utc for storage ngModel.$parsers.push(function (localDate) { if (!localDate) return; return moment(localDate, 'DD/MM/YYYY').utc().toISOString(); }); } }; } })();
Ele usa esse filtro utcToLocal que garante que a data de input esteja no formato correto antes da conversão para a hora local.
(function () { 'use strict'; angular .module('app') .filter('utcToLocal', Filter); function Filter($filter) { return function (utcDateString, format) { if (!utcDateString) { return; } // append 'Z' to the date string to indicate UTC time if the timezone isn't already specified if (utcDateString.indexOf('Z') === -1 && utcDateString.indexOf('+') === -1) { utcDateString += 'Z'; } return $filter('date')(utcDateString, format); }; } })();
moment.js é usado para converter datas locais para utc.
pickadate.js é o plugin de datepicker usado