2011-09-03 17 views
25

Backbone.js'nin lastiklerini tekmelemek ve son haftalarda bir oyun oynamak zorunda kaldım, bu yüzden bir kaç soru ...backbone.js - Nerede görünüm yardımcıları tanımlamak için?

Görüntü yardımcılarını tanımlamak ve kullanmak için 'doğru' yol nedir? backbone.js?

Bildiğim kadarıyla halledebiliriz gibi şablonlarınızda kullanmak yardımcıları tanımlamak için tek gerçek yer model veya koleksiyonla kendisi üzerindedir. Ancak, bu yardımcı doğrudan HTML döndürdüğünde, bu biraz kirli hissetmeye başlar.

Daha iyi bir yolu var mı?

cevap

41

Ben backbone.js ile görünüm yardımcıları koymak birkaç farklı yerde vardır: yardımcı belli görünüme özgüdür

ise sağ görünüm tanımında koydu:

var MyView = Backbone.View.extend({ 
    tagName: 'div', 

    events: { 
    ... 
    }, 

    initialize: function() { ... }, 

    helperOne: function() { 
    // Helper code 
    }, 

    anotherHelper: function() { 
    // Helper code 
    }, 

    render: function() { 
    ... this.helperOne() ... 
    } 
}); 

_.extend(Backbone.View.prototype, { 
    helper: function() { 
    // Helper code 
    } 
} 
01: yardımcı tüm görünümlerde tarafından kullanılacaksa tüm görünümler bu işlevi devralması için

, Backbone görüntüle sınıfını genişletmek (Veya kurulu bir iyi uygulama varsa)

var MyOtherView = MyView.extend({ 

    // ... 

    render: function() { 
    ... this.helperOne() ... 
    } 
}); 

Ben en iyi yöntem ne olduğundan emin değilim, ama bu:

sen görünümler arasında yardımcılarından daha karmaşık paylaşımını gerekiyorsa, sahip görüşlerin birbirini uzatmak desenler oldukça temiz görünüyor ve iyi çalışıyor. Eğer daha büyük Omurga uygulamaları oluşturmak üzere

+1

O Katmalar yapmak da mümkündür (yani Sınıf gerektiği gibi sınıflar koleksiyonundan "mixin" yöntem) ve daha da yönü yönelimli programlama (başka bir yöntem ile bir hedef yöntemi sarma, bir fonksiyon çağrısı sınıflar koleksiyonu geçersiz sahip) bulunur. 'Kullanarak Backbone Görünüm sınıfı –

+2

1' extend' 'Benim için çalışıyorsun, ama olmadı bu .__ proto__' yaptığım iş içinde this'. __proto__' yöntemleri sadece 'bu' ile çalışmamalıdır? Bu '' this.myMethod() '' 'nun aksine' 'bu ___ proto __. MyMethod()'. Benim için, ikincisi işe yarıyor ama eski başarısız. Bunun için – isNaN1247

+1

Hmm uzatılması için –

0

, muhtemelen her şeyi ad alanı isteyeceksiniz. O zaman küresel yardımcılar için bir yer olacak. Henüz mükemmel ad alanı kurulumunu yapmadım. Ama şu anda böyle bir şey yapıyorum:

brainswap:{ 
    appView: {},   <== Reference to instantiated AppView class. 
    classes = {   <== Namespace for all custom Backbone classes. 
    views : {}, 
    models : {}, 
    collections: {}, 
    controllers : {}, 
    Router: null 
    }, 
    models: {},   <== Instantiated models. 
    controllers: {},  <== Instantiated controllers. 
    router: {},   <== Instantiated routers. 
    helpers: {},   <== Reusable helper platform methods. 
    currentView: {},  <== A reference to the current view so that we can destroy it. 
    init: function(){} <== Bootstrap code to start app. 
} 

Bence sınıfları şuna benzer:

brainswap.classes.views.profile.contact = brainswap.classes.views.profile.base.extend({... 

Benim kontrolör yeni görünümler başlatır (ve currentView bir başvuru yerleştirir nesnedir. Eğer her zaman tüm unbinded olsun önceki görünümler olaylar böylece son görünümünü kaldırmak ve sizin bellek kullanımını azaltmak gerektiğini unutmayın.

0

Hızlı çözeltisi (CoffeeScript)

Backbone.View::handlebarsTemplate = (templateName) -> 
    Handlebars.compile $(templateName).html() 

Sonra görünümde o kullanabilirsiniz:

Yourcoolapp.Views.ThingsIndex extends Backbone.view 

    initialize: -> 
    @template = this.handlebarsTemplate("#hb_template") 
    # etc... 

    someMethod: => 
    @template = this.handlebarsTemplate("#hb_other") 
İlgili konular