0

私は次の設定をしています:

    var LayerItemView = Backbone.Marionette.ItemView.extend({

    tagName: 'li',
    className: 'stage-layer',
    template: '#layer-item-tpl',

    initialize: function() {
           $(this.el).attr('id' 'layer-'+this.model.id);
    },

    onRender: function() {
    App.vent.trigger('layer:rendered', this.model);
    }

});

私が信じていたように、DOM 要素 layer-[id] が利用可能になるはずです。eventHandler は次に、各モデルの Raphael キャンバスを、次のように新しく作成された DOM 要素に作成します。

var paper1 = new Raphael(document.getElementById('layer-1'), 896,504);  
var paper2 = new Raphael(document.getElementById('layer-2'), 896,504);  
var paper3 = new Raphael(document.getElementById('layer-3'), 896,504);  
etc.

しかし、Raphael からエラーが返されます: Uncaught TypeError: Cannot read property 'x' of undefined

これは、レイヤ ID を持つ要素がまだ DOM で利用できないことを示しています。私は単純な setTimeout で問題を解決します (一種のこれを行います):

setTimeout(function() {
  var paper1 = new Raphael(document.getElementById('layer-1'), 896,504);  
  var paper2 = new Raphael(document.getElementById('layer-2'), 896,504);  
  var paper3 = new Raphael(document.getElementById('layer-3'), 896,504);    
},0);

私はこれに満足していません。それは正しい練習でしょうか?これが機能する理由と、それが良い習慣であるかどうかを理解したい

4

1 に答える 1