0
여기에 무엇이 누락되어 있는지 잘 모르겠습니다. 사이트가 처음로드되고 빈 양식을 제출하려고하면 유효성 검사 결과의 유효성 검사가 올바르게 valid == false
을 나타냅니다. 그런 다음 사이트의 아무 곳에서나 다시 유효성 검사를 시도하고 유효성 검사는 항상 valid == true
을 반환합니다. 브라우저를 새로 고침하면 처음에는 다시 작동하지만 나중에는 작동하지 않습니다. 초기 시도에서 내 ValidationController
예 (this.validation
)를 검사처음에는 유효하지만 이후에는 적용되지 않습니다
, bindings
이 채워집니다. 이후에 시도, bindings
가 비어 있습니다.
다음은 유효성 검사 설정 방법의 예입니다.
create.ts
import { autoinject} from "aurelia-framework";
import { ValidationController, ValidationRules } from "aurelia-validation";
import { DefaultValidationControllerFactory } from "../../lib/validation/default-validation-controller-factory";
import { Customer } from "../../lib/models/Customer";
@autoinject
export class CreateForm {
private validation: ValidationController;
public customer = new Customer();
constructor(validationControllerFactory: DefaultValidationControllerFactory) {
this.validation = validationControllerFactory.createForCurrentScope();
}
public attached() {
ValidationRules
.ensure((o: Customer) => o.firstName)
.required()
.ensure((o: Customer) => o.lastName)
.required()
.ensure((o: Customer) => o.facebookName)
.required()
.ensure((o: Customer) => o.state)
.required()
.on(this.customer);
}
public createCustomer() {
this.isBusy = true;
return this.validation
.validate()
.then(result => {
if (result.valid) {
// ...
}
})
.finally(() => {
this.isBusy = false;
});
}
}
create.html
<template>
<div busy.bind="isBusy" class="form content-area">
<div class="row">
<div class="col-xs-12 col-sm-6">
<div class="row">
<div class="col-xs-6">
<div class="form-group">
<label>First Name</label>
<input value.bind="customer.firstName & validate" type="text" class="form-control" />
</div>
</div>
<div class="col-xs-6">
<div class="form-group">
<label>Last Name</label>
<input value.bind="customer.lastName & validate" type="text" class="form-control" />
</div>
</div>
</div>
<div class="row">
<div class="col-xs-12">
<div class="form-group">
<label>Email Address</label>
<input value.bind="customer.emailAddress & validate" type="text" class="form-control" />
</div>
</div>
</div>
</div>
</div>
</div>
</template>
기본 - 검증 - 컨트롤러 factory.ts
import { autoinject } from "aurelia-framework";
import { Validator, ValidationController, ValidationControllerFactory, ValidationRules } from "aurelia-validation";
import { DefaultValidationRenderer } from "./default-validation-renderer";
@autoinject
export class DefaultValidationControllerFactory {
private validationControllerFactory: ValidationControllerFactory;
private validationRenderer: DefaultValidationRenderer;
constructor(validationControllerFactory: ValidationControllerFactory, validationRenderer: DefaultValidationRenderer) {
this.validationControllerFactory = validationControllerFactory;
this.validationRenderer = validationRenderer;
}
public create(validator?: Validator): ValidationController {
let validationController = this.validationControllerFactory.create(validator);
this.setDefaults(validationController);
return validationController;
}
public createForCurrentScope(validator?: Validator): ValidationController {
let validationController = this.validationControllerFactory.createForCurrentScope(validator);
this.setDefaults(validationController);
return validationController;
}
private setDefaults(validationController: ValidationController) {
validationController.addRenderer(this.validationRenderer);
}
}
기본 - 검증 - renderer.ts
import { inject } from "aurelia-dependency-injection";
import { ValidationRenderer, RenderInstruction } from "aurelia-validation";
const ValidationErrorClassName = "validation-error";
@inject(Element)
export class DefaultValidationRenderer implements ValidationRenderer {
private boundaryElement: HTMLElement;
constructor(boundaryElement: HTMLElement) {
this.boundaryElement = boundaryElement;
}
public render(instruction: RenderInstruction) {
for (let item of instruction.unrender) {
for (let target of item.elements) {
let messages = target.parentElement.getElementsByClassName(ValidationErrorClassName);
for (let i = 0; i < messages.length; i++) {
let message = messages[i];
target.parentElement.removeChild(message);
}
}
}
for (let item of instruction.render.filter(o => !o.result.valid)) {
for (let target of item.elements) {
let message = target.ownerDocument.createElement("div");
message.classList.add(ValidationErrorClassName);
message.innerHTML = item.result.message;
target.parentNode.insertBefore(message, target.nextSibling);
}
}
}
}
감사합니다. 당신은 정교 할 수 있습니까? –
글쎄, 왜 그런지 모르겠다.하지만 당신 공장이 항상 같은 인스턴스를 만들고있는 것처럼 보인다. 그래서, 그것은 처음으로 작동합니다. 두 번째로 같은 컨트롤러 인스턴스를 얻었으므로 작동하지 않습니다. 왜 이런 일이 일어나는지 정확히 알기 위해서는 소스 코드를 살펴 봐야 할 것입니다. 내 대답이 당신의 문제를 해결 했습니까? –
네, 그랬습니다, 고마워요! –