如何让 Knockout.js 设置属性的命名空间 URI?

2023-12-25

在 svg 中,如果我使用淘汰赛来设置xlink:href属性为a节点,属性的命名空间设置不正确,因此a单击时不能用作链接。

例如,请考虑以下包含两个链接的椭圆的 svg。有其一xlink:href属性是硬编码的,另一个是通过淘汰赛设置的data-bind属性:

<svg width="5cm" height="6cm" viewBox="0 0 5 6" version="1.1" 
     xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> 
  <rect x=".01" y=".01" width="4.98" height="5.98"  
        fill="none" stroke="blue"  stroke-width=".03"/> 
  <a xlink:href="#hardcoded"> 
    <ellipse data-bind="attr: blue" /> 
  </a> 
  <a data-bind="attr: { 'xlink:href': href }"> 
    <ellipse data-bind="attr: red" /> 
  </a> 
</svg>

让淘汰赛运行起来非常简单:

ko.applyBindings( { 
  blue: { cx:2.5, cy:1.5, rx:2, ry:1, fill:"blue" },
  href: '#foo', 
  red: { cx:2.5, cy:4.5, rx:2, ry:1, fill:"red" },
});

但只有硬编码的链接才有效。如果我添加一些代码来查看namespaceURI属性节点的值,我可以看到 这xlink:href通过淘汰赛设置的属性有一个nullnamespaceURI,而不是硬编码的,后者设置为http://www.w3.org/1999/xlink.

Array.forEach( document.getElementsByTagName('a'), function(a){
  a.setAttribute('title', 'xlink:href namespaceURI = ' + a.getAttributeNode('xlink:href').namespaceURI);
});

You can 在小提琴中查看这一切 http://jsfiddle.net/ZghP7/.

有没有一种简单的方法可以告诉淘汰赛属性的正确命名空间应该是什么,或者我是否需要编写自定义绑定?


我的后备解决方案是添加此自定义绑定:

ko.bindingHandlers['attr-ns'] = {
  update: function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
    ko.utils.objectForEach( ko.unwrap( valueAccessor() ), function(name, value){
      var prefixLen = name.indexOf(':');
      var prefix    = name.substr( 0, prefixLen );
      var namespace = prefixLen < 0 ? null : element.lookupNamespaceURI( prefix );

      element.setAttributeNS( namespace, name, ko.unwrap( value ) );
    });
  }
};

并更改模板以使用attr-ns我定义的绑定:

<a data-bind="attr-ns: { 'xlink:href': href }">
  <ellipse data-bind="attr: red" />
</a>

这似乎工作正常,但如果不需要,我宁愿不这样做。更多自定义代码=更多可能出错的地方。

You can 在小提琴中查看此解决方案 http://jsfiddle.net/XfJkJ/2/.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何让 Knockout.js 设置属性的命名空间 URI? 的相关文章

随机推荐