Aurelia 中的数据绑定父子关系

2024-01-07

代码:

我有两节课:

export class Shipment {
    shipmentId: number;
    widget: Widget;

}

export class Widget {
    widgetId: number;
    name: string;
}

然后我有一个ShipmentUi具有发货实例的视图模型(this.shipment).

并且在ShipmentUiview 我编写了 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.widgetwill 仍将引用原始小部件。

问题:

在 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里面只会有小部件。但这有点丑陋...我希望有另一种方法...

所以,我的问题是:我的上述说法正确吗?如果是的话,还有其他方法可以保持我的对象模型干净吗?


如果我正确理解这个问题,您正在寻找一种与 widgetui 组件共享最少量数据的方法。而不是给它整个装运对象,以便它可以操纵shipment.widget属性,您宁愿给它一个 widget 属性的属性访问器。

好消息:这正是@bindable是设计来做的。您需要做的就是停止使用 compose 并使用以下命令制作自定义元素@bindable表示自定义元素完成其工作所需的最小数据量的属性。例如:

widget-picker.js

import {bindable, bindingMode} from 'aurelia-framework';

export class WidgetPicker {
  @bindable({ defaultBindingMode: bindingMode.twoWay }) widget;
  @bindable widgets;
}

widget-picker.html

<select value.bind="widget">
  <option repeat.for="widget of widgets" model.bind="widget">${widget.name}</option>
</select>

usage:

<widget-picker widget.bind="shipment.widget" widgets.bind="widgets"></widget-picker>

Example:

https://gist.run/?id=4c726da335aaecefd80b https://gist.run/?id=4c726da335aaecefd80b

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Aurelia 中的数据绑定父子关系 的相关文章

随机推荐

  • 无法从堆中收集无法访问的对象

    我正在努力解决 JVM 堆 Java 1 7 中无法访问的对象 从图中可以看到 图中所有类都是不可达的 我们有超过74 的对象没有引用 所以应该被垃圾收集 在我们的 tomcat 7 服务器上运行 3 周后就会出现这种状态 该服务器仅运行
  • AS3:如何从事件侦听器功能中的 LoaderInfo 获取动态加载程序 URL?

    我正在加载许多图片 并使用数组来执行此操作 loader i load new URLRequest picture i 我的事件监听器功能是这样启用的 loader i contentLoaderInfo addEventListener
  • 使用 Akka 从 Play 应用程序进行 Web 服务调用

    我对于使用 Play 框架和 Akka 进行编程相当陌生 尽管我已经阅读它们有一段时间了 我现在正在默认 基本 Play 环境上启动一个概念验证应用程序 我的问题源于 Play 中的 Web 服务客户端 api http www playf
  • 由于 IPTABLES 更改,SVN 无法工作

    由于我重新启动了安装了 svn 的 Ubuntu 服务器 因此我无法从笔记本电脑访问它 使用 svnX 当我尝试浏览我的曲目库时 出现错误 svn Can t connect to host xxx xxx Address already
  • 使用开放 API 配置设置全局参数?

    我在用Spring Boot REST OpenAPI 3规格 在此示例中 我希望全局设置标题 Custom Header Version v1 我想在向每个端点发出请求时传递它 现在的问题是我已经100 个 REST 端点对于每个端点我需
  • Spring Data api(包含或 startwith)不适用于具有通配符的 SPACE

    我正在将 Elastic Search 与 Spring Data 结合使用 我在存储库中有一个简单的方法 findByUserNameContaining a b 由于空间原因 此方法未给出预期结果 获取错误 无法构造查询 a b 请改用
  • 在 C# 中简单实现 SHA-3 Keccak 哈希到错误的输出?

    我正在尝试获取 HashLib 库 https hashlib codeplex com https hashlib codeplex com 适用于新的 SHA 3 Keccak 算法 我编写了一个简单的控制台应用程序 据说必须输出正确的
  • CMake、RPATH、$ORIGIN 和 @loader_path

    在我的 CMake 项目中 我构建了一堆在运行时作为插件加载的库 因此 我需要设置各种RPATH 以便动态加载机制可以找到这些库 我还需要整个东西是可重定位的 因为它是 Python 扩展模块的一部分 因此在构建过程中会被各种工具复制 似乎
  • install.packages 中出现错误:未安装软件包“RGtk2”,因为它不是为 UCRT 构建的

    我尝试安装拨浪鼓和 RGtk2 我用了 install packages https cran microsoft com snapshot 2021 12 15 bin windows contrib 4 1 RGtk2 2 20 36
  • SqlParameter和IN语句[重复]

    这个问题在这里已经有答案了 我需要以下查询 createList string commaSeparatedElements SqlCommand query new SqlCommand SELECT FROM table WHERE i
  • Play Framework webservice 教程 scala [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用客户端 HTML 表排序对行进行分组

    是否有现有的表格排序库 或者有没有办法配置表格排序器 http tablesorter com docs 每两行排序 或者 是否有更好的方法来语义地表达我的表 以便标准行排序可以工作 我有一个 html 表 看起来像这样 table the
  • SBT 集成测试设置

    我想向我的 SBT Spray 应用程序添加集成测试阶段 理想情况下 它就像 Maven 一样 具有以下阶段 compile 应用程序已构建 test 单元测试已运行 pre integration test 应用程序在单独的进程中启动 i
  • 获取与 Leaflet 类关联的 DOM 元素

    有没有办法获取a对应的DOM元素Marker http leafletjs com reference html marker or Layer http leafletjs com reference html ilayer与传单 就像使
  • mySQL - 使用返回多行的选择更新多列

    我有一个邮政编码表 我想用它的 3 个最近邻居更新每个邮政编码 即填写此表中的空白 postcode nearestPostcode1 nearestPostcode2 nearestPostcode3 KY6 1DA KY6 1DG KY
  • 如何使用 TrueForAll

    我有一个布尔列表 我想检查是否每个列表都设置为 true 我可以运行一个循环并以这种方式检查它 但我想尝试这样做TrueForAll列表的方法 我需要一个谓词 但我找不到这样一个简单任务的明确示例 Use All http msdn mic
  • MDM:服务器 URL 的 ssl 问题

    我想使用Lion Server管理iOS设备 我购买了Lion Server并安装在具有Lion OS 10 7的Mac系统中 我想在我们自己的网络中管理设备 我没有为 MDM 采用特定的域 在 IPCU 中为 MDM 创建 cofig 配
  • 将数组的索引更改为所需的顺序问题

    您好 我有一个索引为 0 13 的数组 其键值为每个索引都有一个自己嵌套的数组 我希望能够将其顺序更改为 0 2 1 3 4 5 7 6 8 10 9 11 13 12 这是我的尝试 但它不起作用 var array 1 array id
  • Qt Windeployqt 导致部署不可用

    我在用着windeployqt可执行文件来准备我的安装树 该工具将所有必需的 甚至一些不必要的 dll 复制到指定文件夹中 并对 Qt5Core dll 进行硬编码路径变量的修补 以下是我执行该工具的方法 C Qt 5 11 2 mingw
  • Aurelia 中的数据绑定父子关系

    代码 我有两节课 export class Shipment shipmentId number widget Widget export class Widget widgetId number name string 然后我有一个Shi