当父值从子项更改为DI

时间:2017-03-17 11:49:09

标签: aurelia aurelia-binding

目标是能够更新"标题"在SharedParent和/或SharedState视图中,只要它从子项通过DI更改。

我怀疑Aurelia路由器自定义元素上的layout-viewlayout-view-model存在问题。

我需要这个,因为真实代码中的SharedParent,将是抽象的一般计算函数(保存在SharedParent中的变量,当前未在视图中更新)等孩子们将调用(以避免每个孩子复制此功能)。理想情况下引用SharedParent的DI引用。

理想的解决方案可以直接修改父级。 SharedState只是一种额外的测试方式,如果你能看到一种方法让它与选项1一起工作,可以忽略它。

选项1 是我工作的最高优先级

在此处查看实时运行要点:https://gist.run/?id=66eeff540a4665694a31482b790bf01e

更新

我已经制定了另一个要点,以表明我为了让父/子关系正常工作而尝试的另一种方式:https://gist.run/?id=080d4ac3f4d8677d344140a7827aea94 - 在这个例子中,只是另一个问题由于重复的"路线"当前路线未正确设置路由器中的属性。但在这里,至少我们能够从孩子们那里更新父母属性。理想的解决方案是同时使用1个解决方案。这样就可以正确设置活动路径,并且子级将能够更新依赖注入的父级属性。最后,父视图需要刷新此更改。这个要点来自另一个问题:How to dynamically build navigation menu from routes linking to parent/child views/controllers - 但稍作修改以帮助说明在这个问题中没有做什么'要点,确实在这里工作。

总结一下。

我首先尝试用这种方式来解决我的问题:https://gist.run/?id=080d4ac3f4d8677d344140a7827aea94 - 几乎所有事情都应该工作(在孩子的父母中设置标题)并在子视图中反映父母的日期/语言的变化 - 从子项设置父属性。唯一不起作用的是路由。我无法显示活动路线,因为多条路线共享相同的路线"属性。

所以我看了一下layout-view(-model)解决方案(我在这个问题中提出了这个问题) - 这似乎解决了路由问题,但打破了父/子之间的绑定。

2 个答案:

答案 0 :(得分:3)

我让它在这里工作: https://gist.run/?id=6c112829bb42a5ed86b78b4c8917a72c

  • 我在@singleton(true) =>上设置SharedParent装饰器DI Basics
  • 我使用了注入的父
  • 中现有的BindingSignaler

答案 1 :(得分:1)

ChildA由容器构造,然后构建路径视图中指示的布局视图和布局视图模型。这意味着容器必须创建SharedParent的新实例(让我们称之为"实例1")以提供给ChildA的构造函数。

稍后,构建路由器视图的布局视图模型(SharedParent)。当容器构造自定义属性,自定义元素和路由器视图模型时,模板系统的默认行为是告诉容器&#34;给我一个新的实例,不要重用现有的&#34;# 34 ;.这很有道理,大多数时候你不希望表单上出现的所有10 <my-number-input>都是同一个实例,而不是你想要的10个标准html {{1你的表单上的元素是相同的...你希望它们是独立的。因此构建了<input>的第二个实例,这就是为什么您的标头代码无效... SharedParent具有与路由器视图不同的ChildA实例。

SharedParent上使用@singleton可解决此问题,但更好的方法是让SharedParentSharedParentChildA依赖ChildB 1}} class(例如SharedState)。这将消除覆盖默认行为的需要,使得更清楚共享依赖关系是什么,并保持@inject(SharedState)SharedParent之间关注点的良好分离。

ChildA

这是一个例子:https://gist.run/?id=dfe291e3da67854d143d264a2edd5ade