2013-02-12 22 views
11

Backbone.js kullanarak basit bir RSS uygulaması geliştirmeye çalışıyorum. Bu backbone.js tutorial kullanıyorum. Şablonu tanımlarken, satır 2'de (şablon) aşağıdaki hatayı alıyorum. Birisi de bana neden TagName olduğunu öğretebilir: "li" öğreticide tanımlı?yakalanmamış TypeError: undefined backbone.js 'replace' yöntemini çağırın.

uncaught TypeError: Cannot call method 'replace' of undefined backbone.js

Javscript

window.SourceListView = Backbone.View.extend({ 
    tagName:"li", 
    template: _.template($('#tmpl_sourcelist').html()), 

    initialize:function() { 
     this.model.bind("change", this.render, this); 
     this.model.bind("destroy", this.close, this); 
    }, 

    render:function (eventName) { 
     $(this.$el).html(this.template(this.model.toJSON())); 
     return this; 
    }, 

    close:function() { 
     $(this.el).unbind(); 
     $(this.el).remove(); 
    } 
}); 

HTML

<script type="text/template" id="tmpl_sourcelist"> 
         <div id="source"> 
         <a href='#Source/<%=id%>'<%=name%></a> 
         </div> 
       </script> 

sayesinde Haklısınız buradan hata alıyorsanız

+0

Şablonu verileri kullanmadan çalıştırmayı deneyin ve ne aldığınızı görün ... bu. $ El.html (this.template()) – beNerd

+0

Bu satır2'de hata veriyor (şablon: _.template ($ ('# tmpl_sourcelist')) biçimini())). Ne tavsiye edeceğinizden emin değilsiniz. – jsp

cevap

44

:

'ın içlerinin
template: _.template($('#tmpl_sourcelist').html()), 

Bölüm derlenmiş şablon işlevi üretme yolunda derlenmemiş Şablon metnine String#replace çağıran içerir. Yani belirli hata genellikle etkili bu söylüyorsun anlamına gelir: Eğer $('#tmpl_sourcelist').html() derken DOM hiçbir #tmpl_sourcelist varsa gerçekleşebilir

_.template(undefined) 

.

birkaç basit çözüm vardır: Eğer görünümünü yüklemeye çalışmadan önce senin #tmpl_sourcelist gelir, böylece

  1. sizin <script> sırasını ayarlayın.

    window.SourceListView = Backbone.View.extend({ 
        tagName:"li", 
        initialize:function() { 
         this.template = _.template($('#tmpl_sourcelist').html()); 
         //... 
    

Bildiğim kadarıyla tagName giderse, fine manual bunu söylemek etti:

elview.el

[...] this.el is created from the view's tagName , className , id and attributes properties, if specified. If not, el is an empty div .

  • görünümünüzü en initialize yerine görünümün "Sınıf" tanımı içinde derlenmiş şablon işlevi oluşturma

    Bunu sizin görüşünüze göre sahip olmak:

    tagName: 'li' 
    

    Backbone, görünümünüzün el görünümüne göre otomatik olarak yeni bir <li> öğesi yaratacağı anlamına gelir.

    +0

    harika cevap! Benim durumumda bana yardımcı oldu çünkü \t $ ("# target") html (_. Template (template, [posts])); bir id = hedef arıyordu ama bir sınıftı. – Anthony

    +0

    @Anthony: Teşekkürler. Yani aynı '_.template (undefined)' problemini gizlemek o zaman. –

    İlgili konular