【问题标题】:Bindings namespacing in KnockoutKnockout 中的绑定命名空间
【发布时间】:2014-12-25 17:17:14
【问题描述】:

我创建了一个 Knockout 组件,我为其创建了一些自定义绑定。其中之一是名为textInput 的绑定。

现在我想升级到 Knockout 3.2,但发现他们也创建了一个新的 textInput 绑定,这将与我的绑定发生冲突。

我想升级到新版本并且不想重命名我的绑定,因为它在很多地方都被引用。我需要诸如“命名空间”之类的东西来进行绑定。我可以用来组织我的绑定以不与其他本机或自定义绑定发生冲突的东西。

【问题讨论】:

    标签: knockout.js


    【解决方案1】:

    如果您想为绑定处理程序“命名空间”,只需使用“带点”名称创建它们,例如“my.namespace.textInput”。这样,您还可以通过包含“命名空间”来使用它们。

    这方面的一个例子是:

    ko.bindingHandlers['my.namespace.textInput'] = {
        //Same content as you already have in your binding handler.
    };
    

    这个绑定处理程序的用法可能如下所示:

    <input data-bind="my.namespace.textInput: myValueProperty" />
    

    我在 http://jsfiddle.net/4zwo8s30/ 的 jsfiddle 上放了一个使用这种命名方法的示例。

    【讨论】:

    • 我以为我以前试过这个但没有用。我当时认为这是因为 KO 将绑定解析为 JS 对象文字,并且点在属性名称中无效。我会再次测试它并回来。
    • 我根据您的解决方案更改了所有绑定,并且它们运行良好。唯一的缺点是 Visual Studio 无法识别此语法并将其视为错误。谢谢你的回答
    • 我之前尝试的时候没有用,因为我是这样写绑定的ko.bindingHandlers.my={ namespaced: { bindingHandler: { update: … } } };
    • 你也可以只做前缀而不是“命名空间”。使用“c_”、“my_”、公司/产品名称或类似名称为您自己的所有自定义绑定添加前缀。这样它也应该在 VS 中正常工作。关于属性名称中的点,它是一个 javascript 功能,您可以通过使用点或索引器来引用属性。在第二种情况下,您可以在属性名称中使用一些原本无法使用的字符。但仅仅使用前缀而不是尝试命名事物可能是一个更好的主意。