SVG not rendering properly as a backbone view

后端 未结 3 1308
温柔的废话
温柔的废话 2020-12-28 16:11

I\'m using d3.js to render a map of the world in svg (using https://github.com/johan/world.geo.json/blob/master/countries.geo.json for the features). I am encapsulating the

相关标签:
3条回答
  • 2020-12-28 16:26

    The issue is that the "svg" element requires a namespace. D3 does this for your automatically; when you append an "svg" element, it uses the namespace "http://www.w3.org/2000/svg". For details, see src/core/ns.js. Backbone, unfortunately, does not appear to support namespaced elements. You'd want to change the view.make method. Then you'd need a namespaceURI property on your view to set the appropriate namespace, or just do it automatically for SVG elements for consistency with the HTML5 parser.

    At any rate, a simple fix for your problem is to wrap your SVG in a DIV element, and then use D3 to create the SVG element.

    0 讨论(0)
  • 2020-12-28 16:30

    Check this out http://jsfiddle.net/nocircleno/QsEp2/ from http://nocircleno.com/blog/svg-with-backbone-js/

    Backbone.View.extend({
      nameSpace: "http://www.w3.org/2000/svg",
      _ensureElement: function() {
         if (!this.el) {
            var attrs = _.extend({}, _.result(this, 'attributes'));
            if (this.id) attrs.id = _.result(this, 'id');
            if (this.className) attrs['class'] = _.result(this, 'className');
            var $el = $(window.document.createElementNS(_.result(this, 'nameSpace'), _.result(this, 'tagName'))).attr(attrs);
            this.setElement($el, false);
         } else {
            this.setElement(_.result(this, 'el'), false);
         }
     }
    });
    
    0 讨论(0)
  • 2020-12-28 16:48

    You could simply set the view's element in the initialize function as follows:

    Backbone.View.extend({
        // This is only for informaiton. The node will
        // be raplaced in the initialize function.
        tagName: 'svg',
    
        initialize: function () {
            this.setElement(
                d3.select($('<div/>')[0]).append('svg')[0]
            );
        }
    );
    

    This has the advantage of being explicite.

    0 讨论(0)
提交回复
热议问题