3

编辑:这个问题曾经的标题是“当父级在 Aurelia 中的类型相同时通过 DI 获取父级”,但由于我的元素是嵌套的,因此将父级绑定到元素更有意义,因此标题已更改来反映这一点。

如果我有一个自定义元素,Thing它有一个子元素Thing(有另一个子元素Thing等),当类相同时如何注入父实例?

export class Thing {
    static inject = [Thing]; // <-- no reference to Thing as we are inside the class
    constructor(parentThing) {
        this.parent = parentThing;
    }
}

作为进一步的复杂性,根Thing元素将没有父元素,因此 DI 需要允许可选注入。

4

3 回答 3

2

我不认为你的问题可以用 DI 解决。如果您想拥有它的几个实例,则必须是Thing@transient这意味着容器不会保存对其创建的事物的引用。

于 2016-04-24T06:50:52.663 回答
1

这个问题看起来不正确或不需要使用 DI。如果一个元素需要从它的消费者那里接收一些特定的输入数据,@bindable 将是我自然而然的第一想法。那么创建一个@bindable parentThingin怎么样Thing

另一方面,如果您想要访问父绑定上下文,请考虑bind() 组件生命周期

于 2016-04-24T09:38:58.397 回答
0

这是如何做到这一点:https ://gist.run?id=b075366d29f2400d3cc931f6fc26db24

应用程序.html

<template>
  <require from="./thing"></require>

  <thing name="A">
    <thing name="B">
      <thing name="C">
        <thing name="D">
        </thing>
      </thing>
    </thing>
  </thing>
</template>

应用程序.js

export class App {
}

可选的parent.js

import {resolver} from 'aurelia-dependency-injection';

@resolver()
export class OptionalParent {
  constructor(key) {
    this.key = key;
  }

  get(container) {
    if (container.parent && container.parent.hasResolver(this.key, false)) {
      return container.parent.get(this.key)
    }
    return null;
  }

  static of(key) {
    return new OptionalParent(key);
  }
}

东西.html

<template>
  <h3>
    My Name is "${name}".
    <span if.bind="parent">My parent's name is "${parent.name}".</span>
    <span if.bind="!parent">I don't have a parent.</span>
  </h3>
  <content></content>
</template>

东西.js

import {bindable, inject} from 'aurelia-framework';
import {OptionalParent} from './optional-parent';

@inject(OptionalParent.of(Thing))
export class Thing {
  @bindable name;

  constructor(parent) {
    this.parent = parent;
  }
}
于 2016-04-26T20:31:36.870 回答