【问题标题】:custom bindinghandler in knockoutjs淘汰赛中的自定义绑定处理程序
【发布时间】:2016-03-05 20:44:37
【问题描述】:

我的 html 中有 div,如下所示..

<div data-helper="my helper text1">help</div>

我的 javascript 中有一个数组

self.helpers = [
       { name: ' abc ', helper: ' my helper text1 ' },
       { name: ' def ', helper: ' my helper text2 ' },
       { name: ' xyz ', helper: ' my helper text3 ' }
           ];

使用 knockoutjs,我想将 helper 绑定到 data-helper 文本。

基本上我需要一些东西可以将下面的代码转换为必要的 html 代码..

<div databind="helper:helpers.helper">help</div>

我尝试创建自定义绑定处理程序但不能..

真诚感谢任何帮助。

谢谢

更新:我在未查看代码的情况下接受了答案,因此必须重新提出问题。 我需要线条如下所示..

<div data-helper="my helper text1">help</div>

所以,div data-bind:text 可能不起作用

我尝试如下但没有成功..

<!-- ko foreach: helpers -->
            <div data-bind="attr: {data-helper:helper}">help
            </div>
            <!-- /ko -->

【问题讨论】:

  • 向我们展示你目前拥有的处理程序,没有它(可能还有更多代码,足以形成minimal reproducible example),很难想象你的目标是什么。跨度>
  • 您是否尝试为数组中的每个项目呈现 html?
  • @Neps 是的,使用 data-helper 属性渲染 html

标签: knockout.js


【解决方案1】:

有两种方法可以实现此功能:custom componentcustom binding。您可以从下面的简短示例开始:

ko.components.register('my-component', {
        viewModel: {
            createViewModel: function(params, componentInfo) {
              return {
                helpers: params.helpers
              };
            }
        },
        template: { element: 'my-component-template' }
    });

ko.bindingHandlers.helper = {
        init: function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
          var values = valueAccessor(),
              $templateHtml = $('#my-component-template').text(),
              $element = $(element).append($templateHtml);
            var childContext = bindingContext.createChildContext(values);
            ko.applyBindings(childContext, $element.children()[0]);
            return { controlsDescendantBindings: true };
        }
    };

ko.applyBindings([
       { name: ' abc ', helper: 'my helper text1' },
       { name: ' def ', helper: 'my helper text2' },
       { name: ' xyz ', helper: 'my helper text3' }
           ]);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>

<script type="text/html" id="my-component-template">
    <div>
        <!-- ko foreach: helpers -->
            <div data-bind="text: helper, attr: { 'data-helper': helper }">
            </div>
        <!-- /ko -->
    </div>
</script>

<div>Component:</div>
<my-component params="helpers: $data"></my-component>

<div>Custom binding:</div>
<div data-bind="helper: { helpers: $data }"></div>

自定义组件由注册码("ko.components.register('my-component'...")和模板("...")组成。

更新 1。

我添加了自定义绑定示例。您可以查看documentation了解更多详情。

更新 2

你应该用引号包裹 attr 名称:

<div data-bind="text: helper, attr: { 'data-helper': helper }">
</div>

【讨论】:

  • OP 专门(尽管出于未知的原因和以模糊的方式)要求自定义 绑定处理程序,而不是组件。
  • 谢谢@Jeroen,我已经更新了答案。恕我直言组件是一种更好的方法。
  • @TSV 用更多信息更新了问题,我对组件或自定义绑定处理程序没有问题,但每行中的代码必须看起来像 '
    帮助
    '
猜你喜欢
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-22
  • 2016-03-31
  • 1970-01-01
  • 2013-03-14
相关资源
最近更新 更多