javascript - Använd validering på klassobjekt utan injektion i Aurelia
Jag står inför ett problem relaterat till injektion(er) i Aurelia. Jag undrade hur man implementerar Validation, EventAggregator och Router utan injektion.
Nedan kan du hitta ett exempel som kan ge dig en tydlig bild av implementeringen och var jag har fastnat.
class Profile interagerar med vyn, och ett objekt av AddressList skapas i profile class och detta objekt (AddressList) interagerar med vyn.
Till exempel:
@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(){
}
Nu vill jag implementera valideringar på egenskaperna i AddressList utan att skicka Validation i konstruktorn för AddressList
Jag vill inte ha detta
this.addressList.push(new AddressList(Valdiation));
Eftersom detta kommer att skapa problem när jag vill skicka argument i konstruktören för AddressList.
Jag tror att detta problem också kommer att uppstå när vi försöker komponera en vy-modell i en annan vy-modell och konstruktorn förväntar sig några användardefinierade argument.
Tack i förväg,
Ankur
Uppdateringar/Förändringar i frågorna
Jag gjorde ändringarna som föreslogs av Matthew James Davis. Men jag kan inte förstå varför AddressList blir undefined.
Uppdaterad kod
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];
}
}
Fel i konsolen
AddressList
function() {
for (var _len = arguments.length, rest = Array(_len), _key = 0; _key < _len; _key++) {
rest[_key] = arguments[_key];
}
return container.invoke(_this2._…
AddressList ()
Felet beror på denna rad i Container.prototype._createInvocationHandler:
if (fn.inject === undefined)
fn är odefinierad.
Jag tror att det kan hjälpa dig, och jag försöker fortfarande lista ut vad problemet kan vara.
Svar #1
Som Patrick noterade kan du uppnå detta med Aurelias Factory-upplösare:
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];
}
}
Svar #2
Jag är inte säker på om det här är problemet, men eftersom jag använder TypeScript vet jag att du också behöver importera inject från aurelia-framework.
En annan möjlighet skulle vara att injicera det så här:
private static inject = [EventAggregator, Validation, Factory.of(AddressList)]Men om du inte använder TypeScript är jag inte säker på om detta är nödvändigt.
