首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将模型更改注册到MDL输入元素

将模型更改注册到MDL输入元素
EN

Stack Overflow用户
提问于 2016-08-17 08:16:58
回答 2查看 424关注 0票数 0

在将MDL与框架集成时,框架将直接设置输入值,但MDL库不会注意到这些更改,因为这些更改可能会绑定到单击和更改事件。例如,如果我有:

代码语言:javascript
复制
<div class="mdl-textfield mdl-js-textfield mdl-textfield--floating-label">
    <input class="mdl-textfield__input" type="text" id="joke" pattern="-?[0-9]*(\.[0-9]+)?">
    <label class="mdl-textfield__label" for="joke">Joke...</label>
    <span class="mdl-textfield__error">Input is not a number!</span>
</div>

然后使用一些javascript更改该值:

代码语言:javascript
复制
document.getElementById('joke').value=text;

元素标签不会移动,并且被文本覆盖。简而言之,没有设置is-dirty类。

下面是一个更详细地说明该问题的示例。https://plnkr.co/6pAh7ApQT8TUUS9G9QBg

我目前正在做Angular2的一个项目,但我认为总体问题是框架不可知的。我希望有比我的“答案”更好的解决方案。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-29 01:07:48

我找到的最好的解决方案就是使用指令。您可以在元素上调用checkDirty()。

代码语言:javascript
复制
import { Directive, AfterViewInit, ElementRef, AfterViewChecked} from '@angular/core';
declare var componentHandler: any;

@Directive({
    selector: '[mdl]'
})
export class MDL implements AfterViewInit {
    constructor(private element: ElementRef) {
    }

    ngAfterViewInit() {
        componentHandler.upgradeAllRegistered();
    }

    ngAfterViewChecked() {
        let mdlField = this.element.nativeElement.MaterialTextfield;
        if (mdlField) {
            mdlField.checkDirty();
            mdlField.checkValidity();
        }
    }
}

然后,只需在模板中将此指令包含在mdl输入的父div中

代码语言:javascript
复制
<div mdl class="mdl-textfield mdl-js-textfield mdl-textfield--floating-label mdl-cell mdl-cell--5-col mdl-cell--8-col-tablet mdl-cell--4-col-phone">
    <label class="mdl-textfield__label" for="promoCode_{{inRibbon}}">Promo code</label>
    <input class="mdl-textfield__input" type="text" id="promoCode" name="promoCode_{{inRibbon}}" [ngModelOptions]="{standalone: true}" [(ngModel)]="itemAvailabilityRequest.promoCode">
</div>
票数 0
EN

Stack Overflow用户

发布于 2016-08-17 08:16:58

更新答案:

绑定到类列表https://angular.io/docs/ts/latest/guide/template-syntax.html#!#ngClass可能是一种更好的方法:

示例:

代码语言:javascript
复制
<div class="mdl-textfield mdl-js-textfield mdl-text-field--floating-label"
    [class.is-dirty]=" val != null && val != '' ">

或者对于mdl-tab:

代码语言:javascript
复制
<div class="mdl-tabs__panel"
    [class.is-active]="val_is_active_tab">

或者对于mdl-复选框:

代码语言:javascript
复制
<label class="mdl-radio mdl-js-radio mdl-js-ripple-effect"
      [class.is-checked]="val == 1">

原始答案:

对于我的项目,我的临时解决方案是放入一些非常非角度的代码:

代码语言:javascript
复制
private thingsToDirty = [];
ngAfterViewChecked() {
    for (let id of this.thingsToDirty) {
        let el: any = document.getElementById(id);
        if (el != undefined && 
        el.parentNode.className.indexOf("is-dirty") == -1) {
            el.parentNode.className += " is-dirty";
        }
    }
    this.thingsToDirty.length = 0;
}

ngOnInit() {
    this.something.getJSONfromServer().subscribe( data => {
        this.thing = data;
        this.thingsToDirty.push('thing_id');
    });
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38986337

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档