1
6
组件和自定义处理程序是完全不同的东西。 自定义绑定基本上是 custom binding 有权访问:
其定义包括两个功能:
因此,当您需要直接与DOM元素交互时,应该使用自定义绑定,例如修改其属性、初始化小部件、订阅事件等 组成部分组件完全不同。定义组件时,必须定义:
使用组件时:
因此,组件允许重用视图模型和模板 那么,有什么区别?自定义绑定可以直接访问DOM元素,允许与它们交互、订阅事件、修改属性等 组件只是一个视图模型,以及一组绑定到该特定视图模型的DOM元素。 因此,对于Google Maps,它需要初始化一个小部件(地图)并与map事件交互,并响应可观察的属性请求,您永远不能使用组件,因为组件不允许与DOM元素直接交互。(请记住,是一堆带有绑定的HTML元素,以及相应的视图模型,其中不能包含任何逻辑来插入这些元素)。
自定义绑定通常应用于单个元素(尽管它可以处理其子元素,如
组件通常是一组或多或少复杂的DOM元素,“从外部”是不可访问的。与主视图模型的唯一通信是通过参数完成的。组件不能直接与DOM元素交互:它必须通过ko绑定进行交互。 因此,对于谷歌地图来说,很明显您需要自定义绑定。 只有当您想要模块化或重用一组DOM元素和相关的视图模型时,创建一个组件才有意义,它还可以包括访问web服务(通过AJAX)、进行计算(通常通过使用计算的可观测值)等功能。例如,可以使用一个组件来实现购物车,其中包括:
在这种情况下,购物车将有一个视图模型,该视图模型将包括计算的可观测值(显示总额和税收)、删除项目、修改数量、存储或支付等功能。还有一组具体的DOM元素,该元素具有此视图模型的绑定,即显示购物车并与其交互的HTML。 在谷歌地图的情况下,如果没有自定义绑定的帮助,或者没有 黑客使用额外的非ko脚本 . 如果您想在地图旁边显示一个位置列表,并修改该列表,可以使用一个组件,该组件将包括一个带有列表和相关功能的视图模型,以及一个模板,该模板包含一个带有谷歌地图自定义绑定的元素。这是有意义的:视图模型+几个元素。 结论这意味着定制绑定通常与绑定的DOM元素有深度交互,而组件与元素有更高级别的交互,这必须通过绑定完成。 因此,他们在一个非常不同的层面上发挥作用。您不能比较或交换它们。 如果你坚持这样做,你可以创建一个像组件一样的绑定,因为你可以完全控制元素,并且可以完全访问视图模型,但这比组件更难实现。也许也可以用某种深奥的方式反过来。 |
2
1
结合 结合 ,一个习惯与否,是一个非常简单的概念,包括两件事:
从上面来看,如果只实现了1,则称为 单向绑定 (因为如果您更改UI,它将更新对象,但不会反过来)。如果同时实现了1和2,则称为 双向绑定 . 因此,在任何时候,如果您认为需要做些什么,那么您都需要使用绑定,如果框架没有所需的绑定,则需要使用自定义绑定。 最有可能的是,你所说的地图需要像上面这样的东西。事实上,这是因为作者在第一段中这样说:
请看,作者在上面讨论了2个问题:当ViewModel更改时,更改UI元素的位置。 组成部分 A. 组成部分 是一个概念,即拥有一个可重用的项目,该项目可能有一个UI,但不一定有,并且所有需要的代码都与它一起打包。这样可以重复使用。例如,它可能只是一个只允许数字的输入UI元素。它所需的所有代码都与UI元素一起打包。 现在,与它一起打包的代码可能与绑定相关。如果他们使用的框架没有所需的绑定,它甚至可能有自定义绑定。此外,它可能有与绑定无关的附加代码。 此外,组件可以具有单个UI元素或多个UI元素。具有多个元素的组件的一个很好的例子是消息框。 结论 绑定和组件是分开的。组件中可能有绑定,也可能有其他代码使其工作,或者两者兼而有之。 就您提到的地图而言,它们只添加了一个功能:对ViewModel中的更改做出反应。它不是一个组件,因为它不是自包含和可重用的。 他们本可以使用一个组件来完成。但是,如果他们这样做并说它是一个KO组件,那么它可能仍然有特定于KO的绑定代码,以及ViewModel和所需的所有UI元素。 |