2015-09-09 162 views
0

我想在@ensure中集中验证逻辑,但我不知道该怎么做。 这是从文档的例子:集中Aurelia验证逻辑

import {Validation} from 'aurelia-validation'; 
 
import {ensure} from 'aurelia-validation'; 
 

 
export class Person { 
 
    static inject() { return [Validation];} 
 
    
 
    //I want to inject validation logic here instead of using function(it){...} 
 
    @ensure(function(it){ it.isNotEmpty().hasLengthBetween(3,10) }) 
 
    firstName = 'John'; 
 

 
    constructor(validation) { 
 
    this.validation = validation.on(this); 
 
    } 
 
}

,我会改变上面的代码如下喜欢:

import {Validation} from 'aurelia-validation'; 
 
import {ensure} from 'aurelia-validation'; 
 
import {UserValidation} from 'user/userValidation'; //custom validation logic here 
 

 
export class Person { 
 
    static inject() { return [Validation];} 
 
    
 
    //can I do something like this instead of using function(it){...}? 
 
    @ensure(UserValidation.firstName) 
 
    firstName = 'John'; 
 

 
    constructor(validation) { 
 
    this.validation = validation.on(this); 
 
    } 
 
}

如果我们需要只收集第一页的名字,然后我们不必这样做毕竟,由于我们可能必须让用户在多个不同的页面上输入他们的名字,我们希望将验证逻辑集中在某处,以便我们不必复制&将它粘贴到任何地方。我们不想创建“名字组件”,因为UI在每个页面上都会有所不同,所以我们只是想重用验证逻辑。

更新: 我在Aurelia讨论中问过这个问题,并被要求尝试以下操作。

//userValidation.js 
 
export function firstName(it){ it.isNotEmpty().hasLengthBetween(3,10)};

import {Validation} from 'aurelia-validation'; 
 
import {ensure} from 'aurelia-validation'; 
 
import * as userValidation from 'user/userValidation'; 
 

 
export class Person { 
 
    static inject() { return [Validation];} 
 
    
 
    @ensure(userValidation.firstName) 
 
    firstName = 'John'; 
 

 
    constructor(validation) { 
 
    this.validation = validation.on(this); 
 
    } 
 
}

但我收到此错误:未处理的承诺拒绝错误:错误实例化人。任何想法如何我可以解决这个问题?

+0

我不知道为什么注射也没有创造新的验证 - 但你可以尝试: 'code' 构造函数(){ this.validation =新的验证(); this.validation.on(this); } '代码' – Steve

+0

@Steve,其实上面的代码工作,但我不得不删除我的测试代码,不在上面的代码示例中的一行。对困惑感到抱歉。我发布了下面的答案。 –

回答

1

其实,下面的代码工作!

//userValidation.js 
export function firstName(it){ it.isNotEmpty().hasLengthBetween(3,10)}; 

//person.js 
 
import {Validation} from 'aurelia-validation'; 
 
import {ensure} from 'aurelia-validation'; 
 
import * as userValidation from 'user/userValidation'; 
 

 
export class Person { 
 
    static inject() { return [Validation];} 
 
    
 
    @ensure(userValidation.firstName) 
 
    firstName = 'John'; 
 

 
    constructor(validation) { 
 
    this.validation = validation.on(this); 
 
    } 
 
}

+0

意识到这是前一阵子,但是你对userValidation.js做了什么?你是否导出了课程,然后是每个功能?我自己尝试了一个类似的策略 – jbailie1991

+0

@ jbailie1991,如果我正确理解你的话,你应该可以在userValidation.js(firstName,lastName等)中添加尽可能多的验证函数,并且你只需要添加一个因为*会引用userValidation.js中的所有函数,因此“import * as userValidation .....”引用的js文件(person.js) –

+0

警告:@ensure已从aurelia-validation中删除。您必须使用其他策略。 –