代码:
我有两节课:
export class Shipment {
shipmentId: number;
widget: Widget;
}
export class Widget {
widgetId: number;
name: string;
}
然后我有一个ShipmentUi
具有发货实例的视图模型(this.shipment
).
并且在ShipmentUi
view 我编写了 UI 的一部分,显示了允许选择 Widget 的 WidgetUi:
<compose view-model="src/views/widgetUi" model.bind="shipment"></compose>
WigetUi 的视图模型节省了运费。所以 WidgetUi 有一个this.shipment
.
然后 widgetUi 的视图显示一个选择器:
<select value.bind="shipment.widget" >
<option class="dropdown-toggle" repeat.for="widget of widgets"
model.two-way="widget">${widget.name}</option>
</select>
问题设置:
在我的 compose 标签中(在 ShipmentUi 的视图中),我宁愿绑定到shipment.widget
.
这将使 WidgetUi 的视图模型只能得到一个this.widget
. (The WidgetUi
类不需要看到或知道shipment
。它的唯一功能是允许选择Widget
。它不需要关心它是用于发货还是其他东西。)
但是,据我了解 Javascript,这是行不通的。
因为如果我只是传递对shipment.widget的引用,那么WidgetUi将只有对widget部分的引用。首先是 WidgetUi 的this.widget
将具有与 ShipmentUi 相同的引用this.shipment.widget
.
但是当用户选择不同的小部件时,WidgetUithis.widget
将获得不同的引用(指向下拉列表中新选择的小部件)。但是 ShipmentUi 的this.shipment.widget
will 仍将引用原始小部件。
问题:
在 Javascript 中绑定子对象时,如果您想了解子对象的交换,是否总是必须传入包含对象?
提出这个问题的原因是我的测试并不是100%结论性的。所以我希望有人能为我解决这个问题。
我也希望我在某种程度上是错的,因为我真的不喜欢必须公开包含类中的所有数据的想法。 (允许访问shipment
in the WigetUi
在这种情况下类。)
再次询问(澄清):
法比奥·卢兹 (Fabio Luz) 要求对我的问题进行一些澄清。所以这里有一个尝试。这将演练上面的示例,但将其更改为我希望它工作的方式。
我有两个小部件。尖锐的小部件和沉闷的小部件。
ShipmentUi.js:
这个类有变量this.shipment.widget
。我要说的是它的价值是'A3'(任意内存值)。 “A3”是对名称为“Sharp Widget”的小部件的引用。
然后我将小部件传递给 WidgetUi 类:
<compose view-model="src/views/widgetUi" model.bind="shipment.wiget"></compose>
WidgetUi.js:
WidgetUi 类具有:
activate(widget: Widget) {
this.widget = widget;
}
现在在 WidgetUi 中this.widget
也有一个值“A3”。该值是对名称为“Sharp Widget”的 Widget 的内存引用。
现在用户使用这个select
更改小部件的元素:
<select value.bind="widget" >
<option class="dropdown-toggle" repeat.for="widget of widgets"
model.two-way="widget">${widget.name}</option>
</select>
这次我绑定到widget
(代替this.shipment.widget
就像我上面做的那样)。
然后用户使用以下命令选择一个名为“Dull Widget”的小部件select
。该小部件的值为“B7”。 “B7”是对名为“Dull Widget”的小部件的引用。
据我了解 JavaScript,WidgetUi 的this.widget
现在的值为“B7”(这是对“Dull Widget”的引用)。 (这是通过 Aurelia 数据绑定系统完成的。)
但是 ShipmentUi 的this.shipment.widget
仍然是“A3”(这是对“Sharp Widget”的引用)。
这不是我绑定时想要的this.shipment.widget
to the compose
元素。我希望小部件对象的更新能够反映在发货中。 (注意,如果我刚刚更新widget.name
,那么它就会被更新。)
因此,据我所知,我必须将完整的父级传递给compose
元素 (this.shipment
在这种情况下),如果我想要捕获一个作业。
我希望我错了(或者有解决方法),因为传递父对象使我可以共享“子”类不需要知道的详细信息。 (即它破坏了数据封装)
我想我可以在班级的每一层之间建立一个“支架”。例如:this.shipment.holder.widget
and holder
里面只会有小部件。但这有点丑陋...我希望有另一种方法...
所以,我的问题是:我的上述说法正确吗?如果是的话,还有其他方法可以保持我的对象模型干净吗?