javascript - KO 的组件层次结构(或缺乏)

标签 javascript knockout.js

KnockoutJS 支持某种组件层次结构或范围吗?本质上,我正在寻找这样的东西:

ko.components['parent'].components.register('child1', ...)

我在文档中没有看到类似的内容。如果没有这个,我必须强制我的所有组件都具有全局唯一的名称。

最佳答案

我认为拥有一个伪造命名空间的全局对象应该足以防止名称冲突。例如:

var c = {
  editor: {
    message: "c.editor.message"
  }
};

ko.components.register(c.editor.message, {
    viewModel: function(params) {
        this.text = ko.observable(params && params.initialText || '');
    },
    template: 'Message: <input data-bind="textInput: text" /> '
            + '(length: <span data-bind="text: text().length"></span>)'
});
 
ko.applyBindings();
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>

<div data-bind='component: c.editor.message'></div>

(示例组件取自 here )

您甚至可以包装 register 方法来自动创建命名空间并通过帮助程序处理未定义的命名空间。但可能会让事情变得不必要的复杂。不过,我认为以某种方式“保护”全局组件 namespace 以防止覆盖是个好主意。

var c = (function() {
  var components = {};
  
  var register = function(path, opts) {
    return path
      .reduce(function(pos, k, i, arr) {
        if (i >= arr.length - 1) {
          if (pos[k]) {
            throw new Error("Component name [" + arr + "] already in use");
          }
          
          pos[k] = arr.join("--");
          ko.components.register(pos[k], opts);
        } else {
          pos[k] = pos[k] || {};
        }
      
        return pos[k];
      }, components);
  };
  
  var get = function() {
     return Array.from(arguments)
       .reduce(function(pos, k) {
         return k ? pos[k] || k : null;
       }, components);
  };
  
  return {
    register: register,
    get: get
  };
}());

c.register(["editor", "message"], {
    viewModel: function(params) {
        this.text = ko.observable(params && params.initialText || '');
    },
    template: 'Message: <input data-bind="textInput: text" /> '
            + '(length: <span data-bind="text: text().length"></span>)'
});
 
ko.applyBindings();
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>

<div data-bind='component: c.get("editor", "message")'></div>

关于javascript - KO 的组件层次结构(或缺乏),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41429098/

相关文章:

javascript - 如何让html5播放器在没有源码的情况下播放

knockout.js - 使用 Knockout-ES5 时如何访问自定义绑定(bind)中的可观察对象

javascript - javascript 中的下拉列表包含数据库中的值

javascript - 带有 Spring Boot 和 JavaScript 的 WebSocket

jquery - 通过jquery选择器查找 knockout 元素

javascript - knockout validation 组错误检查

javascript - 将下拉列表中的值添加到 KnockoutJS 中另一个下拉列表中的任意一组值

javascript - 为什么下拉列表的值没有绑定(bind)?

javascript - 在数组上应用 parseInt 会产生奇怪的结果

javascript - 计算递减值的算法,接近极限