为什么不能在camelCase中命名和注册Knockout自定义组件?

拉杰什

我最近开始从事Knockout的工作,并被分配去创建可在各种应用程序中使用的自定义组件。在创建组件时,我使用了驼峰式的命名方式,例如:“ datePicker”。

组件代码

ko.components.register("datePicker",{
    viewModel: require('./components/date-picker-widget'),
    template: require('raw!./components/date-picker-widget.html')
});

HTML代码

<datePicker params="{value:returnValue, initialValue:returnValue.initialValue}"></datePicker>

但这是渲染的:

呈现的HTML代码

因此,很明显,Knockout需要使用小写字母的组件名称(JSFiddle参考)。问题仍然是为什么?

我还看到了在React中对组件命名的类似限制,您必须在名称中仅以大写字母开头。

耶罗恩

密钥在文档中

默认情况下,Knockout假定您的自定义元素标记名称与使用ko.components.register注册的组件的名称完全对应。这种配置约定惯例策略对于大多数应用而言是理想的选择。

如果要使用不同的自定义元素标记名称,则可以重写getComponentNameForNode来控制它。例如,

ko.components.getComponentNameForNode = function(node) {
    var tagNameLower = node.tagName && node.tagName.toLowerCase();

    if (ko.components.isRegistered(tagNameLower)) {
        // If the element's name exactly matches a preregistered
        // component, use that component
        return tagNameLower;
    } else if (tagNameLower === "special-element") {
        // For the element <special-element>, use the component
        // "MySpecialComponent" (whether or not it was preregistered)
        return "MySpecialComponent";
    } else {
        // Treat anything else as not representing a component
        return null;
    }
}

例如,如果您想控制已注册组件的哪个子集可以用作自定义元素,则可以使用此技术。

实际上,文档并没有完全与代码相提并论,因为它声称“完全对应”,而实际上在代码中,标签名仅小写,而注册不是。

无论如何,由于浏览器返回的tagName是大写字母,因此上述代码仅在您的注册为小写字母时才有效。

因此,您可以datePicker在视图中使用camelCased并将其注册为小写:

<datePicker></datePicker>
ko.components.register("datepicker",{
    viewModel: function() { },
    template: '<strong>DatePicker stub is showing!</strong>'
});

$(function() { ko.applyBindings({}); });

或者,您可以猴子修补注册功能:

<datePicker></datePicker>
var originalFn = ko.components.register;

ko.components.register = function(name, options) {
    originalFn(name.toLowerCase(), options);
};

ko.components.register("datePicker",{
    viewModel: function() { },
    template: '<strong>DatePicker stub is showing!</strong>'
});

$(function() { ko.applyBindings({}); });

尽管我不确定这将如何稳定和跨浏览器兼容。

在任何情况下都无关紧要,因为您只是问“为什么”,就像那样。

我的建议:坚持的文档风格dash-cased-element-names

PS。您发布的屏幕快照是调试器如何渲染元素的方式,而不是Knockout或浏览器的方式。实际上,很可能如果您使用“查看源代码”,则会得到一个camelCased元素名称。完全确定您可以检查请求的原始内容。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么我不能在Objective-C中同时实现自定义设置程序和自定义获取程序?

来自分类Dev

为什么我不能在Django-Oscar中自定义模板?

来自分类Dev

为什么onStopTrackingTouch不能在带有seekbar的自定义适配器中工作?

来自分类Dev

Qt - 为什么我不能在 MainWindow 中为我的自定义按钮触发 mousePressEvent

来自分类Dev

为什么不能在通用catch子句中捕获自定义异常

来自分类Dev

为什么我的ORMLite自定义持久性程序不能在Android上运行?

来自分类Dev

为什么自定义resourceGenerator不能在编译时执行?

来自分类Dev

为什么不能在通用catch子句中捕获自定义异常

来自分类Dev

为什么我不能在Google搜索页面等某些网站中使用自定义字体

来自分类Dev

为什么不能在GHC中定义:=?

来自分类Dev

为什么我不能在Laravel 5.2中注册和登录?

来自分类Dev

为什么我不能在2.0.0.0播放器框架中重用1.8.2.2 Player框架中的自定义XAML样式PlayPauseButton

来自分类Dev

为什么我不能在Visio中重命名形状?

来自分类Dev

为什么不能在 MS Excel 中重命名附件?

来自分类Dev

为什么不能在 MS Excel 中重命名附件?

来自分类Dev

如何访问Knockout组件中的自定义元素?

来自分类Dev

为什么我不能在定义中定义变量?

来自分类Dev

为什么自定义ImageView的onClickListener无法注册?

来自分类Dev

Sencha Touch-为什么在我的自定义组件中未定义此功能?

来自分类Dev

为什么我的自定义对象不能由onSaveInstanceState和onRestoreInstanceState保留

来自分类Dev

如果class属性是atomic,为什么不能自定义getter和setter?

来自分类Dev

为什么onSaveInstanceState和onRestoreInstanceState不能保留我的自定义对象

来自分类Dev

如果class属性是atomic,为什么不能自定义getter和setter呢?

来自分类Dev

为什么我的自定义组件中的无线电输入元素不能与反应式表单一起正常工作?

来自分类Dev

为什么我不能在“登录”和“注册”代码中更改个人资料图片的大小?

来自分类Dev

为什么不能在结构定义中忽略寿命?

来自分类Dev

为什么不能在Shell中定义空函数?

来自分类Dev

为什么我不能在声明中定义静态字段?

来自分类Dev

为什么我不能在JUnit中定义期望的ParseException?

Related 相关文章

  1. 1

    为什么我不能在Objective-C中同时实现自定义设置程序和自定义获取程序?

  2. 2

    为什么我不能在Django-Oscar中自定义模板?

  3. 3

    为什么onStopTrackingTouch不能在带有seekbar的自定义适配器中工作?

  4. 4

    Qt - 为什么我不能在 MainWindow 中为我的自定义按钮触发 mousePressEvent

  5. 5

    为什么不能在通用catch子句中捕获自定义异常

  6. 6

    为什么我的ORMLite自定义持久性程序不能在Android上运行?

  7. 7

    为什么自定义resourceGenerator不能在编译时执行?

  8. 8

    为什么不能在通用catch子句中捕获自定义异常

  9. 9

    为什么我不能在Google搜索页面等某些网站中使用自定义字体

  10. 10

    为什么不能在GHC中定义:=?

  11. 11

    为什么我不能在Laravel 5.2中注册和登录?

  12. 12

    为什么我不能在2.0.0.0播放器框架中重用1.8.2.2 Player框架中的自定义XAML样式PlayPauseButton

  13. 13

    为什么我不能在Visio中重命名形状?

  14. 14

    为什么不能在 MS Excel 中重命名附件?

  15. 15

    为什么不能在 MS Excel 中重命名附件?

  16. 16

    如何访问Knockout组件中的自定义元素?

  17. 17

    为什么我不能在定义中定义变量?

  18. 18

    为什么自定义ImageView的onClickListener无法注册?

  19. 19

    Sencha Touch-为什么在我的自定义组件中未定义此功能?

  20. 20

    为什么我的自定义对象不能由onSaveInstanceState和onRestoreInstanceState保留

  21. 21

    如果class属性是atomic,为什么不能自定义getter和setter?

  22. 22

    为什么onSaveInstanceState和onRestoreInstanceState不能保留我的自定义对象

  23. 23

    如果class属性是atomic,为什么不能自定义getter和setter呢?

  24. 24

    为什么我的自定义组件中的无线电输入元素不能与反应式表单一起正常工作?

  25. 25

    为什么我不能在“登录”和“注册”代码中更改个人资料图片的大小?

  26. 26

    为什么不能在结构定义中忽略寿命?

  27. 27

    为什么不能在Shell中定义空函数?

  28. 28

    为什么我不能在声明中定义静态字段?

  29. 29

    为什么我不能在JUnit中定义期望的ParseException?

热门标签

归档