Eu tenho uma entrada de texto e não quero permitir que os usuários usem espaços, e tudo que for digitado será transformado em minúsculas.
Eu sei que não tenho permissão para usar filtros no modelo ng, por exemplo.
ng-model='tags | lowercase | no_spaces'
Eu olhei para criar minha própria diretiva, mas adicionando funções $parsers
e $formatters
não atualizei a entrada, apenas outros elementos que continham ng-model
nela.
Como posso alterar a entrada que estou digitando no momento?
Estou essencialmente tentando criar o recurso 'tags' que funciona exatamente como o do StackOverflow.
angularjs
angularjs-filter
dom-manipulation
angularjs-ng-model
Andrew WC Brown
fonte
fonte
Respostas:
Eu sugeriria observar o valor do modelo e atualizá-lo mediante alteração: http://plnkr.co/edit/Mb0uRyIIv1eK8nTg3Qng?p=preview
O único problema interessante é com espaços: no AngularJS 1.0.3 ng-model, a entrada apara automaticamente a sequência, para que ele não detecte que o modelo foi alterado se você adicionar espaços no final ou no início (para que os espaços não sejam removidos automaticamente pelo meu código). Mas na 1.1.1 existe a diretiva 'ng-trim' que permite desativar essa funcionalidade ( confirmação ). Decidi usar o 1.1.1 para obter a funcionalidade exata que você descreveu na sua pergunta.
fonte
$watch
força o ouvinte a ser chamado novamente. Em casos simples (onde seu filtro é idempotente), você terminará com o filtro executando duas vezes em cada modificação.Acredito que a intenção das entradas AngularJS e a
ngModel
diretiva é que as entradas inválidas nunca terminem no modelo . O modelo deve sempre ser válido. O problema de ter um modelo inválido é que podemos ter observadores que acionam e executam ações (inadequadas) com base no modelo inválido.A meu ver, a solução adequada aqui é conectar-se ao
$parsers
pipeline e garantir que entradas inválidas não entrem no modelo. Não tenho certeza de como você tentou abordar as coisas ou o que exatamente não funcionou para você,$parsers
mas aqui está uma diretiva simples que resolve seu problema (ou pelo menos minha compreensão do problema):Assim que a diretiva acima for declarada, ela poderá ser usada da seguinte maneira:
Como na solução proposta por @Valentyn Shybanov, precisamos usar a
ng-trim
diretiva se queremos proibir espaços no início / final da entrada.A vantagem dessa abordagem é 2 vezes:
fonte
modelCtrl.$setViewValue(transformedInput); modelCtrl.$render();
Útil seria o link para a documentação: docs.angularjs.org/api/ng.directive:ngModel.NgModelController Uma palavra para "proteger" minha solução é que a propriedade do escopo possa ser alterada não apenas de visualizações e meu caminho cobre isso. Então eu acho que depende de uma situação real como o escopo pode ser modificado.modelCtrl
é o controlador exigido pela diretiva. (require 'ngModel'
)Uma solução para esse problema pode ser aplicar os filtros no lado do controlador:
$scope.tags = $filter('lowercase')($scope.tags);
Não se esqueça de declarar
$filter
como dependência.fonte
Se você estiver usando o campo de entrada somente leitura, poderá usar o valor ng com o filtro.
por exemplo:
fonte
Use uma diretiva que inclua as coleções $ formatadores e $ parsers para garantir que a transformação seja executada nas duas direções.
Veja esta outra resposta para obter mais detalhes, incluindo um link para jsfiddle.
fonte
Eu tive um problema semelhante e usei
no meu manipulador, chamo um método do objectInScope para modificar-se corretamente (entrada grossa). No controlador, iniciei em algum lugar que
Eu sei que isso não usa filtros ou observadores sofisticados ... mas é simples e funciona muito bem. A única desvantagem disso é que o objectInScope é enviado na chamada para o manipulador ...
fonte
Se você estiver executando validação de entrada assíncrona complexa, pode valer a pena abstrair
ng-model
um nível como parte de uma classe personalizada com seus próprios métodos de validação.https://plnkr.co/edit/gUnUjs0qHQwkq2vPZlpO?p=preview
html
código
fonte
Você pode tentar isso
fonte