在Aurelia中对类对象使用Validation而不注入

时间:2016-05-30 11:30:11

标签: javascript typescript aurelia aurelia-validation aurelia-navigation

我正面临一个与Aurelia注射有关的问题。 我想知道如何在不注入的情况下实现验证,EventAggregator和路由器

下面你可以找到一个例子,它可以让你清楚地了解实施情况以及我被困在哪里。

class Profile 与视图交互, AddressList 的对象在配置文件类中创建,此对象(AddressList)与图。

例如:

@inject(EventAggregator, Validation, Router)
export class Profile{
      addressList: Array<AddressList> = [];
      eventAgg:any;
      _validation:any;
      _router:any;
      constructor(EventAggregator, Validation, Router )
                  {
                   this.eventAgg = EventAggregator;
                   this._validation = Validation;
                   this._router = Router;
                   this.addressList.push(new AddressList());
                  }
}

export class AddressList{
      street1:string = "street1";
      street2:string = "street2";
constructor(){
}

现在我想在AddressList的属性上实现验证,而不在AddressList的构造函数中传递验证

我不想要这个

this.addressList.push(new AddressList(Valdiation));

因为当我想在AddressList的构造函数中传递参数时,这会产生问题。

我认为当我们尝试在另一个视图模型中组合一个视图模型并且构造函数需要一些用户定义的参数时,也会出现这个问题。

提前致谢,

ANKUR

  

问题的更新/更改

我完成了Matthew James Davis建议的更改。 但我无法理解为什么AddressList未定义。

  

更新代码

import { Factory } from 'aurelia-framework';
import { ObserverLocator } from 'aurelia-framework';
import { EventAggregator } from 'aurelia-event-aggregator';
import { Validation, ensure } from 'aurelia-validation';

@inject(EventAggregator, Validation, Factory.of(AddressList))
export class Profile{
   addressList: Array<AddressList> = [];
      eventAgg:any;
      _validation:any;
      _router:any;
      constructor(EventAggregator, Validation, AddressList)
                  {
                   this.eventAgg = EventAggregator;
                   this._validation = Validation;
                   this.addressList.push(AddressList(["street1","street2"]));
                  }
 }

@inject(Validation)
export class AddressList{
      street1:string = "street1";
      street2:string = "street2";
      constructor(Validation, args){
         this.street1=args[0];
         this.street2=args[1];
     }
}
  

控制台出错

AddressList
function() {
        for (var _len = arguments.length, rest = Array(_len), _key = 0; _key < _len; _key++) {
        rest[_key] = arguments[_key];
        }

    return container.invoke(_this2._…
AddressList ()

Error Snapshot

错误是由于Container.prototype._createInvocationHandler中的这一行造成的:

 if (fn.inject === undefined)

未定义的。

我认为它可能对你有所帮助,我仍在努力弄清楚可能出现的问题。

2 个答案:

答案 0 :(得分:0)

帕特里克指出,你可以使用Aurelia的Factory解析器实现这一目标:

import { Factory } from 'aurelia-framework';

@inject(Factory.of(AddressList))
export class Profile {

    addressList: Array<AddressList> = [];

    constructor(AddressList) {
        this.addressList.push(
            AddressList(['123 Elm St.', 'Apt B.'])
        );
    }
}

@inject(Validation)
export class AddressList {

    street1;
    street2;

    constructor(Validation, addressList: string[]) {
        this._validation = Validation;
        this.street1 = addressList[0];
        this.street2 = addressList[1];
    }
}

答案 1 :(得分:0)

我不确定这是不是问题,但是当我使用打字稿时,我知道您还需要从aurelia-framework导入inject

另一种可能性就是像这样注入它:

private static inject = [EventAggregator, Validation, Factory.of(AddressList)]

但如果您不使用打字稿,我不确定是否有必要。

相关问题