就数据绑定而言,两个元素都绑定到相同的绑定上下文。考虑这个例子:
<div foo.bind="bar">
<div foo.bind="bar"></div>
</div>
你会期待两者<div>
元素具有相同的绑定上下文,对吗?两个元素的foo
属性应该绑定到相同模型的bar
财产。在这种情况下也是如此:
<myelem foo.bind="bar">
<myelem foo.bind="bar"></myelem>
</myelem>
两个实例<myelem>
绑定到相同的绑定上下文/模型。
如果我正确理解了这个问题,您需要一种优雅的方式来为内部 MyElem 类实例提供对外部 MyElem 类实例的引用。幸运的是,您正在使用 Aurelia,因此有一个非常好的方法可以做到这一点...使用inject
装饰器:
import {inject, Parent} from 'aurelia-dependency-injection';
import {customElement} from 'aurelia-framework';
@customElement("myelem")
@inject(Parent.of(MyElem))
export class MyElem {
constructor(parent) {
this.parent = parent;
}
...
}
不过有一点需要注意...
Aurelia 依赖注入容器的默认行为是,如果在容器中找不到实例,则创建所请求项目的实例。这意味着@inject(Parent.of(MyElem))
并不完全是我们想要的。在没有父 MyElem 实例的情况下,容器将为我们创建一个父实例,而不是返回 null。通常我们会使用@inject(Optional.of(MyElem))
告诉容器给我们实例,只有当它存在于容器中时。我不知道有什么方法可以结合 Parent.of 和Optional.of。我将在 aurelia 依赖注入存储库中创建一个问题,以便我们可以添加此功能。
同时,我们可以轻松创建自己的解析器,结合 Parent.of 和Optional.of 的行为:
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);
}
}
所以我们的 MyElem 类的新版本将如下所示:
import {inject} from 'aurelia-dependency-injection';
import {customElement} from 'aurelia-framework';
import {OptionalParent} from './optional-parent';
@customElement("myelem")
@inject(OptionalParent.of(MyElem))
export class MyElem {
constructor(parent) {
this.parent = parent;
}
...
}
这是一个工作示例。检查控制台中显示结果的日志消息:
https://gist.run/?id=1a84e0a466fb928aa075