当前位置:  开发笔记 > 编程语言 > 正文

淘汰Google Map:组件与自定义绑定处理程序

如何解决《淘汰GoogleMap:组件与自定义绑定处理程序》经验,为你挑选了1个好方法。

当我用谷歌搜索“ 淘汰谷歌地图 ”时,我发现很多基于KO的谷歌地图实现。我能够找到的所有方法都可以使用自定义绑定处理程序,而我本来打算将其实现为Knockout组件。

例子:

http://www.codeproject.com/Articles/351298/KnockoutJS-and-Google-Maps-binding

http://www.hoonzis.com/knockoutjs-and-google-maps-binding/

https://github.com/manuel-guilbault/knockout.google.maps

任何人都可以向我指出正确的方向,为什么在这里比KO组件更喜欢自定义绑定处理程序

我计划的用例是这样的:

我正在实现一个包含地址搜索结果列表的页面。到目前为止,列表是KO组件,每个列表条目是由另一个KO组件生成的,列表组件反复在foreach绑定中调用该组件。在此搜索结果列表的旁边,我需要一张Google地图,该地图也在结果中显示结果条目。列表,列表条目和地图之间也会有很多交互。

到目前为止,这是我得到的:

var GMap = function () {
    var self = this;

    var initMap = function() {
        var map = new google.maps.Map(document.getElementById('map'), {
            zoom: 13,
            center: {lat: 51.4387974, lng: 6.9922915}
        });
    };
  
    initMap();
};
$(document).ready(function() {
  ko.components.register('gmap', {
    viewModel: GMap,
    template: { element: 'gmap' }
  });
  ko.applyBindings();
});
#map {
  height: 400px;
  width: 600px;
}




JotaBe.. 6

组件和自定义处理程序是完全不同的东西。

自定义绑定

基本上,自定义绑定可以访问:

使用它的HTML组件

绑定值(提供给绑定的表达式)

元素中的所有其他绑定

元素的绑定上下文,您可以从中访问$root$parent等等

其定义包括两个功能:

init:允许进行初始设置,例如初始化小部件,设置事件处理程序等

update:被称为init。在那一刻,您可以通过绑定,所有元素绑定,上下文等访问属性(包括可观察的属性)。这将创建一个下标,当任何已访问的可观察到的更改时,将调用update。

因此,当您需要直接与DOM元素进行交互时(例如,修改其属性,初始化小部件,订阅事件等),应使用自定义绑定。

零件

组件完全不同。定义组件时,必须定义:

模板,它是一组DOM元素,通常带有绑定

视图模型(通常是构造函数或工厂)

使用组件时:

视图模型被实例化

模板已加载

viewmodel绑定到模板

因此,componente允许重用视图模型和模板

那么,有什么区别呢?

自定义绑定可以直接访问DOM元素,从而可以与DOM元素进行交互,订阅事件,修改属性等。

一个组件只是一个视图模型,以及一组绑定到该特定视图模型的DOM元素。

因此,对于需要初始化小部件(地图)并与Map事件进行交互并响应可观察到的属性变化的Google Maps,您永远不能使用组件,因为该组件不允许与DOM元素。(请记住,是一堆带有绑定的HTML元素,以及相应的视图模型,其中不能包含与这些元素进行交互的任何逻辑)。

自定义绑定通常适用于单个元素(尽管它可以处理其子元素,例如foreach)。对于Google Maps,您只需要用于显示地图的元素。

组件通常是一组或多或少复杂的DOM元素,“从外部”是不可访问的。与主视图模型的唯一通信是通过参数完成的。该组件无法直接与DOM元素进行交互:它必须通过ko绑定来实现。

因此,对于Google Maps很明显,您需要自定义绑定。

仅当您要模块化或重用一组DOM元素以及相关的视图模型时才创建组件才有意义,该视图模型还可以包括诸如访问Web服务(通过AJAX),进行计算(可能通过使用可计算的可观察对象)等功能,等等。例如,可以使用一个组件来实现购物车,该组件包括:

用于显示购物车中商品的DOM元素(可能是HTML表和一些控件)

用于修改购物车内容的控件(例如,用于删除元素或更改数量)

一个显示总数,税收等的视图模型

存储购物车以备后用或付款的功能(可能是对服务的ajax调用)

在这种情况下,购物车将具有一个视图模型,该视图模型将包括计算出的可观察值(以显示总额和税款),删除项目或修改数量,存储或付款等功能。并为该视图模型绑定了一组具体的DOM元素,即显示购物车并与其进行交互的HTML。

在Google Maps的情况下,如果没有自定义绑定的帮助或恶意使用其他非ko脚本,就无法使用该组件。

如果要显示地图旁边的位置列表并修改该列表,可以使用一个组件,该组件包括带有列表和相关功能的ViewModel,以及包含带有Google Maps自定义绑定的元素的模板。那将是有道理的:viewmodel +几个元素。

结论

这一切都意味着自定义绑定通常与绑定的DOM元素具有较深的交互作用,而组件与这些元素具有较高级别的交互作用,这必须通过绑定来完成。

因此,它们在非常不同的级别上扮演着角色。您无法比较或互换它们。

如果您坚持要这样做,则可以创建一个行为像组件的绑定的野兽,因为您可以完全控制元素,并且可以完全访问视图模型,但这比组件更难实现。并且可能也可以以某种深奥的方式做另一回事。



1> JotaBe..:

组件和自定义处理程序是完全不同的东西。

自定义绑定

基本上,自定义绑定可以访问:

使用它的HTML组件

绑定值(提供给绑定的表达式)

元素中的所有其他绑定

元素的绑定上下文,您可以从中访问$root$parent等等

其定义包括两个功能:

init:允许进行初始设置,例如初始化小部件,设置事件处理程序等

update:被称为init。在那一刻,您可以通过绑定,所有元素绑定,上下文等访问属性(包括可观察的属性)。这将创建一个下标,当任何已访问的可观察到的更改时,将调用update。

因此,当您需要直接与DOM元素进行交互时(例如,修改其属性,初始化小部件,订阅事件等),应使用自定义绑定。

零件

组件完全不同。定义组件时,必须定义:

模板,它是一组DOM元素,通常带有绑定

视图模型(通常是构造函数或工厂)

使用组件时:

视图模型被实例化

模板已加载

viewmodel绑定到模板

因此,componente允许重用视图模型和模板

那么,有什么区别呢?

自定义绑定可以直接访问DOM元素,从而可以与DOM元素进行交互,订阅事件,修改属性等。

一个组件只是一个视图模型,以及一组绑定到该特定视图模型的DOM元素。

因此,对于需要初始化小部件(地图)并与Map事件进行交互并响应可观察到的属性变化的Google Maps,您永远不能使用组件,因为该组件不允许与DOM元素。(请记住,是一堆带有绑定的HTML元素,以及相应的视图模型,其中不能包含与这些元素进行交互的任何逻辑)。

自定义绑定通常适用于单个元素(尽管它可以处理其子元素,例如foreach)。对于Google Maps,您只需要用于显示地图的元素。

组件通常是一组或多或少复杂的DOM元素,“从外部”是不可访问的。与主视图模型的唯一通信是通过参数完成的。该组件无法直接与DOM元素进行交互:它必须通过ko绑定来实现。

因此,对于Google Maps很明显,您需要自定义绑定。

仅当您要模块化或重用一组DOM元素以及相关的视图模型时才创建组件才有意义,该视图模型还可以包括诸如访问Web服务(通过AJAX),进行计算(可能通过使用可计算的可观察对象)等功能,等等。例如,可以使用一个组件来实现购物车,该组件包括:

用于显示购物车中商品的DOM元素(可能是HTML表和一些控件)

用于修改购物车内容的控件(例如,用于删除元素或更改数量)

一个显示总数,税收等的视图模型

存储购物车以备后用或付款的功能(可能是对服务的ajax调用)

在这种情况下,购物车将具有一个视图模型,该视图模型将包括计算出的可观察值(以显示总额和税款),删除项目或修改数量,存储或付款等功能。并为该视图模型绑定了一组具体的DOM元素,即显示购物车并与其进行交互的HTML。

在Google Maps的情况下,如果没有自定义绑定的帮助或恶意使用其他非ko脚本,就无法使用该组件。

如果要显示地图旁边的位置列表并修改该列表,可以使用一个组件,该组件包括带有列表和相关功能的ViewModel,以及包含带有Google Maps自定义绑定的元素的模板。那将是有道理的:viewmodel +几个元素。

结论

这一切都意味着自定义绑定通常与绑定的DOM元素具有较深的交互作用,而组件与这些元素具有较高级别的交互作用,这必须通过绑定来完成。

因此,它们在非常不同的级别上扮演着角色。您无法比较或互换它们。

如果您坚持要这样做,则可以创建一个行为像组件的绑定的野兽,因为您可以完全控制元素,并且可以完全访问视图模型,但这比组件更难实现。并且可能也可以以某种深奥的方式做另一回事。

推荐阅读
携手相约幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有