- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我已经编写了一个简单的CustomValueAccessor来实现pikaday datepicker。它可以工作,但是当我使用日期选择器选择一个日期并更新属性时,内部输入控件(通过ngModel绑定(bind)到该属性)不会更新它的ng-pristine类,而外部组件却可以。我需要将内部输入标记为ng-touched,但我不知道如何实现。
这是我的课:
import { Component, OnInit, Input, Output, EventEmitter, ViewEncapsulation, forwardRef } from '@angular/core';
import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';
import { DateService } from "./shared";
import * as pikaday from 'pikaday'
@Component({
selector: 'datepicker',
templateUrl: 'datepicker.component.html',
styles: [require('pikaday/css/pikaday.css')],
encapsulation: ViewEncapsulation.None,
providers: [
// providers to implement formControlName
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => DatePickerComponent),
multi: true
}
]
})
export class DatePickerComponent implements OnInit, ControlValueAccessor {
/**
* ID of the input element
*/
@Input() id: string;
/**
* The minimum date the user can select. Defaults to today. Set to null to not require.
*/
@Input() minDate: Date = new Date();
/**
* Outputs the chosen date string
*/
@Output('date') dateChanged: EventEmitter<string> = new EventEmitter<string>();
/**
* The formatted date value
*/
private _date: string;
constructor() { }
/**
* Initialises the pikaday datepicker
*/
ngOnInit() {
if(!this.id)
throw "Id is required for datepicker"
let options = {
field: document.getElementById(this.id),
format: DateService.datePickerFormat,
onSelect: date => {
this.date = startDatePicker.toString();
}
};
if(this.minDate)
options['minDate'] = this.minDate;
let startDatePicker = new pikaday(options);
}
/**
* Emits the new date
*/
set date(value){
this._date = value;
this.onChangeCallback(value);
this.onTouchedCallback(value);
}
/**
* Returns the date value
*/
get date(){
return this._date;
}
/**
* Push date to parent components (required by ControlValueAccessor)
*/
onChangeCallback = (_: any) => {};
/**
* let formControlValue interface register a touch callback
*/
onTouchedCallback = (_: any) => {};
/**
* Allows parent component to set the onchange handler
*/
registerOnChange(fn) {
this.onChangeCallback = fn;
}
/**
* Allows parent component to set an ontouch handler (not implemented)
*/
registerOnTouched(fn) {
this.onTouchedCallback = fn;
}
/**
* Called when the component is inited with formControlName
*/
writeValue(value: any) {
this.date = value;
}
}
<input type="text" [id]="id" [(ngModel)]="date">
<datepicker formcontrolname="endDatePicker" id="endDatePicker" ng-reflect-id="endDatePicker" ng-reflect-name="endDatePicker" class="ng-untouched ng-pristine ng-invalid"><input type="text" ng-reflect-model="" ng-reflect-id="endDatePicker" id="endDatePicker" class="ng-untouched ng-pristine ng-valid">
<input type="text" ng-reflect-model="" ng-reflect-id="endDatePicker" id="endDatePicker" class="ng-untouched ng-pristine ng-valid">
</datepicker>
<datepicker formcontrolname="endDatePicker" id="endDatePicker" ng-reflect-id="endDatePicker" ng-reflect-name="endDatePicker" class="ng-touched ng-dirty ng-valid"><input type="text" ng-reflect-model="19 October, 2016" ng-reflect-id="endDatePicker" id="endDatePicker" class="ng-pristine ng-valid ng-touched">
<input type="text" ng-reflect-model="19 October, 2016" ng-reflect-id="endDatePicker" id="endDatePicker" class="ng-pristine ng-valid ng-touched">
</datepicker>
最佳答案
您可以使用ControlValueAccessor
属性从实现ngControl.control
本身的组件中将该控件标记为原始(或脏的,触摸的,未触摸的):
export class DatePickerComponent implements ControlValueAccessor {
// ...
yourFunction(): void {
let control = this.ngControl.control;
// use any of these to manipulate the state of the control in the form
control.markAsTouched();
control.markAsUntouched();
control.markAsDirty();
control.markAsPristine();
}
}
关于javascript - 如何在自定义ControlValueAccessor中更新ng-pristine,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40119401/
如果表单中特定输入的值为空,我尝试禁用materializecss按钮,但只有当表单是$pristine时,我才能使用ng-disable成功禁用它,而不是在输入上。 这有效: data-ng-dis
rails 生成 acts_as_votable:migration忽略 bootsnap-1.3.1,因为它的扩展没有构建。尝试:gem pristine bootsnap --version 1.
我已经实现了一个自定义输入指令 - counter具有复位能力。该指令有 require: "ngModel" . 我正在重置指令 ngModel 的原始状态与 $setPristine() .不像
我已经编写了一个简单的CustomValueAccessor来实现pikaday datepicker。它可以工作,但是当我使用日期选择器选择一个日期并更新属性时,内部输入控件(通过ngModel绑定
我有一个显示 列表的表单元素。它们都共享一个通用的保存按钮,该按钮在表单变脏之前处于禁用状态。然后,一旦用户点击保存按钮,数据就会被提交到服务器。如果服务器成功保存了数据,我想将表单重置为原始状态,
我知道表单元素有一个 $setPristine() 函数,如果我想将 single 设置为 ng-pristine 单元素标签,比如 ,是否有等价的函数? 最佳答案 原始的概念适用于作为整体的形式而不
我喜欢 Subversion 1.7 现在将所有原始内容集中在一个工作副本中。但是,我经常对同一代码库进行多次 check out (主要是为了复制尚不存在的存储功能)。 为了节省磁盘空间,有没有办法
我有一个表单,我需要在我的 $pristine 字段上显示错误。如果我只专注于该领域并专注于而不输入任何内容。但错误从一开始就不应该是可见的。 这是我的fiddle . 这是我的代码...
我有一个带有一些输入的表单,然后是一个打开指令的按钮,一个模式弹出窗口,其中有另一个表单。原始状态不会检测指令中的更改。怎么解决这个问题? SAVE & CLOSE 指令 te
从一位开发人员那里继承项目后,这仍然是我使用 AngularJS 的第一天。我想知道,我的界面上有一个登录/注册表单,一旦提交了项目/表单,它就会隐藏起来。现在,一旦用户提交,是否有正确或适当的方法来
我的用例是我需要根据用户是否更改了表单的值来启用/禁用保存按钮。 当用户单击保存按钮(在进行更改后)时,将进行 AJAX 保存,完成后表单需要再次被视为“原始”,但保持当前值。 我认为设置 form.
以这种形式为例http://plnkr.co/edit/fHEBw6dDdG3IVgnmCLb7?p=preview 我怎样才能把 $pristine SAVE DRAFT 之后表单的状态为真按钮被按
在我的表单中,我有一个 ng-repeat,在该 ng-repeat 中我有一堆字段。有时可能有 3 个字段,有时可能只有 1 个。 我有一个 Angular 来检查 $pristine 的特定字段。
作为一名开发人员,我想在用户使用 React Final Form 成功提交表单时禁用“提交”按钮,并在用户在表单中输入一些新文本时启用“提交”按钮。 当前 变量pristine仅在表单首次加载时将d
我正在使用一个从存储库中 checkout 的大型应用程序,该应用程序的大部分内容位于 .svn/pristine 文件夹中。据我了解,原始文件夹包含我的workingCopy目录中的文件副本 话虽如
经过研究,我仍然陷入困境。我正在使用带有 Angular “预嵌入”的应用程序的最新版本的基础。 我有一个用于添加和编辑数据的表单 - 假设它用于工作并跟踪员工的工作天数。加载 View 时,表单完全
我正在尝试制作一个测验应用程序....但我想向用户提问,这就是为什么我决定制作一个包含很多条件的表单,例如 (ng-if,ng-show, ng-hide),但是我卡在了 this Applicati
我正在尝试围绕 2 个输入框和一个按钮创建一些简单的表单验证。当这些输入字段框为空(原始)时,我希望禁用该按钮。当任一框有值时,我希望按钮能够提交。目前,当输入字段首次呈现时,pristine 属性为
我在 Angular 中有一个表单,其中包含多行字段,其中每一行都是一个 ng-repeat block : 在我的 $scope.processI
我有一个包含大约 100 个问题的表单,每个问题都有一个单选按钮和一些复选框,因此我需要用户能够保存表单并在以后加载它。我还需要检查用户在此 session 中更改了哪些。 本题解决问题:How ca
我是一名优秀的程序员,十分优秀!