接受参数

时间:2016-08-19 11:59:27

标签: javascript mvvm dependency-injection aurelia

我正在构建一个Aurelia应用程序,它为每种类型的数据对象使用“模型”。

我所有的模特看起来都像这样:

export class Item {
    id = null;
    name = '';
    description = '';

    constructor (data) {
        Object.assign(this, data);
    }
}

我后来创建了这样的对象:

export class SomeViewModel {
    activate () {
        this.myItem = new Item({
            name: 'My Item!', 
            description: 'This is my item. It will be initialized with these properties.'
        });
    }
}

我从我读过的一篇文章中得到Object.assign()位,它的效果非常好。它允许我使用来自服务器的数据创建新项目,或者如果我想要一个空项目,我只是不传递任何东西。

现在我已经到了需要我的模型才能访问另一个类的地方,所以我正在使用Aurelia的依赖注入:

import {inject} from 'aurelia-framework';
import {Router} from 'aurelia-router';

@inject(Router)
export class Item {
    id = null;
    name = '';
    description = '';

    constructor (router, data) {
        this.router = router;
        Object.assign(this, data);
    }

    get permalink () {
        return window.location.protocol + '//' + window.location.host + this.router.generate('item', {itemId: this.id});
    }
}

现在我的问题是这个;如何在不传递new Item()的情况下创建Router?我想将参数的顺序切换到constructor()就可以了,但这似乎不适用于Aurelia?

每次创建新项目时我都不想这样做:

import {inject} from 'aurelia-framework';
import {Router} from 'aurelia-router';

@inject(Router)
export class SomeViewModel {
    constructor (router) {
        this.router = router;
    }

    activate () {
        this.myItem = new Item(this.router, {
            name: 'My Item!', 
            description: 'This is my item. It will be initialized with these properties.'
        });
    }
}

当然必须有更好的方法来解决这个问题?

1 个答案:

答案 0 :(得分:2)

使用Factory解析器。这是一个例子:https://gist.run?id=46642ac54893186067e7cd890d6722a3 **

import {inject, Factory} from 'aurelia-dependency-injection';
import {MyModel} from './my-model';

@inject(Factory.of(MyModel))
export class App {
  message = 'Hello World!';

  constructor(createModel) {
    let model = createModel('my data');
  }
}

我-model.js

import {inject} from 'aurelia-dependency-injection';
import {EventAggregator} from 'aurelia-event-aggregator';

@inject(EventAggregator)
export class MyModel {
  constructor(eventAggregator, data) {
    console.log(eventAggregator, data);
  }
}