前提・実現したいこと
Angular6で、複数の画面で共通のdirectiveを使おうと思っています。
複数のプログラマーがテンプレートに個々にdirectiveを埋め込むと抜け漏れが発生するので、
name="corp_name"のinputタグの場合、必ず"HanToZen"というdirectiveを埋め込む様に
ngOnInitで実装したいのですが、うまくいきません。
試したコードは下記です。
setAttributeした後にテンプレートをコンパイルしなおさないといけないのでしょうか。
その場合、テンプレートをコンパイルし直すにはどうすれば良いのでしょうか。
色々調べてはいるのですが未だに解決出来ていません。
どなたかご教授頂けるととても助かります。どうぞよろしくお願いします。
※directiveで呼んでいるconvertHAN2ZENは受け取った文字列の半角文字を全角に変換するだけの関数です。
directiveが有効になる方法が分かれば、処理の内容は何でもいいので省略させて頂きました。
試したこと
directive-test.component.ts
Angular
1import { Component, OnInit, ElementRef, Renderer2 } from '@angular/core'; 2 3@Component({ 4 selector: 'app-directive-test', 5 templateUrl: './directive-test.component.html', 6 styleUrls: ['./directive-test.component.css'] 7}) 8export class DirectiveTestComponent implements OnInit { 9 10 element: HTMLElement; 11 12 constructor(private el: ElementRef,private renderer: Renderer2) { 13 this.element = el.nativeElement; 14 } 15 16 ngOnInit() { 17 // 単純にHTMLelementにZenToHanをsetしてみると、DOMは期待通りになるのですがdirectiveが動きませんでした 18 var input = this.element.getElementsByTagName("input"); 19 for (var i = 0; i < input.length; i++) { 20 if ( input[i].getAttribute("name") === "corp_name") { 21 input[i].setAttribute("HanToZen",""); 22 } 23 } 24 25 // Renderer2でcreateも試してみましたが、HTMLelementにsetAttributeした時と結果は同じでした 26 var rendInput = this.renderer.createElement('input'); 27 this.renderer.setAttribute(rendInput, 'name', 'corp_name2'); 28 this.renderer.setAttribute(rendInput, 'HanToZen', ''); 29 this.renderer.appendChild(this.element, rendInput); 30 } 31}
han-to-zen.directive.ts
Angular
1import {OnInit, Directive, ElementRef, HostListener} from '@angular/core'; 2import { convertHAN2ZEN } from "./util"; 3 4@Directive({ 5 selector: '[HanToZen]' 6}) 7export class HanToZenDirective implements OnInit { 8 9 private element: HTMLInputElement; 10 11 constructor( 12 private elementRef: ElementRef, 13 ) { 14 this.element = this.elementRef.nativeElement; 15 } 16 17 ngOnInit(){ 18 this.element.value = convertHAN2ZEN(this.element.value); 19 } 20 21 @HostListener("blur", ["$event.target.value"]) 22 onBlur(value){ 23 this.element.value = convertHAN2ZEN(value); 24 } 25}
directive-test.component.html
html
1<h2>Directive Test</h2> 2<form #f="ngForm" (ngSubmit)="onSubmit(f)" novalidate> 3 <!-- firstのHanToZenは問題なく動作する --> 4 <input name="first" [(ngModel)]="first" HanToZen> 5 <!-- corp_nameにsetAttributeしたHanToZenは動作しない --> 6 <input name="corp_name" value='100' [(ngModel)]="corp_name" > 7 <button>Submit</button> 8</form>
補足情報(FW/ツールのバージョンなど)
Angular CLI: 6.1.3
Node: 8.11.3
OS: win32 x64
Angular: 6.0.3
... animations, common, compiler, compiler-cli, core, forms
... http, language-service, platform-browser
... platform-browser-dynamic, router
Package Version
@angular-devkit/architect 0.6.5
@angular-devkit/build-angular 0.6.5
@angular-devkit/build-optimizer 0.6.5
@angular-devkit/core 0.6.5
@angular-devkit/schematics 0.7.3 (cli-only)
@angular/cli 6.1.3
@ngtools/webpack 6.0.5
@schematics/angular 0.7.3 (cli-only)
@schematics/update 0.7.3 (cli-only)
rxjs 6.2.0
typescript 2.7.2
webpack 4.8.3

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/08/24 06:24 編集
2018/08/24 06:55
2018/08/24 11:00 編集
2018/08/24 17:51