2015-09-09 108 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中刪除。您必須使用其他策略。 –