Omurga. "El" kafa karışıklığını görüntüleyin


97

Bir görüş nasıl elele alınmalıdır? Ayarlanması gerekir, aksi takdirde olaylar tetiklenmez ( buraya bakın ).

Ama zaten sayfada bulunan bir öğe olmalı mı? Uygulamamda bir (jQuery Şablonları) şablonunu Fancybox'a dönüştürüyorum. elBu durumda ne olmalı ?


11
Düşündüm ki - bu elşeyle uğraşan tek kişi benim .
Yugal Jindle

elgibi gf. kimse onları tam olarak anlayamaz.
Mahi

Yanıtlar:


121

Bir görünüm, tüm olay bağlamanın gerçekleştiği yerdir. Kullanmak zorunda değilsiniz, ancak omurganın olayları ateşlemesini istiyorsanız, işleme işinizi el üzerinde yapmanız gerekir. Bir görünüm, bir DOM öğesidir, ancak önceden var olan bir öğe olması gerekmez. Mevcut sayfanızdan bir tane çekmezseniz oluşturulacaktır, ancak herhangi bir şey yaptığını görmek isterseniz sayfaya eklemeniz gerekecektir.

Bir örnek: Tek tek öğeleri oluşturan bir görünüme sahibim

window.ItemView = Backbone.View.extend({
    tagName: "li", //this defaults to div if you don't declare it.
    template: _.template("<p><%= someModelKey %></p>"),
    events: {
         //this event will be attached to the model elements in
         //the el of every view inserted by AppView below
        "click": "someFunctionThatDoesSomething"
    },
    initialize: function () { 
        _.bindAll(this, "render");
        this.render();
    },
    render: function () {
        this.el.innerHTML = this.template(this.model.toJSON());
        return this;
    }
});
window.AppView = Backbone.View.extend({
    el: $("#someElementID"), //Here we actually grab a pre-existing element
    initialize: function () { 
        _.bindAll(this, "render");
        this.render(new myModel());
    },
    render: function (item) { 
        var view = new ItemView({ model: item });
        this.el.append(view.render().el);
    }
});

İlk görünüm yalnızca liste öğelerini oluşturur ve ikinci görünüm bunları gerçekten sayfaya yerleştirir. Bunun backbone.js sitesindeki Yapılacaklar örneğine oldukça benzediğini düşünüyorum . Bence kongre, sizi içeriğe dönüştürmek içindir. Böylece el, şablonlu içeriğinizi yerleştirmek için bir iniş yeri veya bir kap görevi görür. Backbone daha sonra olaylarını içindeki model verilerine bağlar.

Bir görünüm oluşturduğunuzda kullandığınız dört şekilde el manipüle edebilir el:, tagName:, className:, ve id:. Bunların hiçbiri bildirilmezse, varsayılan olarak kimliği veya sınıfı olmayan bir div'dir. Ayrıca bu noktada sayfayla da ilişkili değildir. TagName kullanarak etiketi başka bir şeyle değiştirebilirsiniz (örneğin tagName: "li", size bir dizi verecektir <li></li>). Diğer kimliğini ve sınıfını da aynı şekilde ayarlayabilirsiniz. Yine de sayfanızın bir parçası değil. El özelliği, el nesnesinin çok ince gren işlemesini yapmanızı sağlar. Çoğu zaman birel: $("someElementInThePage")bu aslında sizin görüşünüzde yaptığınız tüm işlemleri geçerli sayfaya bağlar. Aksi takdirde, görünümünüzde yaptığınız tüm sıkı çalışmanın sayfada görünmesini istiyorsanız, bunu görünümünüzde başka bir yere (muhtemelen renderda) eklemeniz / eklemeniz gerekecektir. El'i tüm görüşünüzün manipüle ettiği bir kap olarak düşünmeyi seviyorum.


Açıklama ve örnek için teşekkürler! Sanırım belirli durumlarda elin ne olması gerektiği her zaman net değildir ve geliştiricinin bunun için bir "his" alması gerekir. Açıklamaların kesinlikle yardımcı oldu! Yine de bir soru: ItemView'ınızda bir el tanımlamıyorsunuz, ancak buna render işlevinde erişiyorsunuz. Bu işe yarayacak mı? Açıkça tanımlamazsanız, bir tür varsayılan başka var mı?
Manuel Meurer

3
Varsayılan olarak el, kimliği veya sınıfı olmayan bir "div" etiketidir. Sayfanızın DOM'una bağlı olmayan bir DOM nesnesidir. Genellikle bunu render fonksiyonundaki veya bir üst görünümün render fonksiyonundaki sayfaya eklerim / eklerim.
LeRoy

Cevabımı, el'i tanımlayan özelliklerin bazı açıklamaları ile güncelledi.
LeRoy

5
Sanırım önceden var olan bir öğeyi el: $ ("# someElementID") ile kapmakla ilgili tek sorunum, görüşünüzün muhtemelen olması gerekenden fazlasını bilmesi ve yeniden kullanılmasını zorlaştırmasıdır. bkz. "Görünümü DOM'dan ayır
Scott Coates

@scoarescoare el özelliğini somutlaştırmaya eklediğiniz için görünümün kendisi olması gerekenden fazlasını bilmiyor, modüler kalıyor ve vermek istediğiniz herhangi bir $ (el) 'i kabul edebiliyor. Yani bu onu gerçekten yeniden kullanılabilir kılıyor.
Metagrapher

6

Şimdi biraz yaşlandım, ama benim de kafam karışmıştı ve bu yüzden buraya gelen diğer insanlar için bu keman yardımcı olabilir - http://jsfiddle.net/hRndn/2/

var MyView = Backbone.View.extend({

    events: {
        "click .btn" : "sayHello",
    },

    sayHello : function() {
        alert("Hello");
    },


    render : function() {
        this.$el.html("<input type='button' class='btn' value='Say Hello'></input>");

    }
});

$(function() {
    myView = new MyView({el:"#parent_id"});
    myView.render();
});

Bu modeli takip ettim ve keşke yapmasaydım. Bir görünümü yok etmek ve bağlamaları kaldırmak için, omurganın kuralı view.remove () şeklindedir. Bu, $ el'i yok eder ve DOM'dan kaldırır, dolayısıyla görünümü yeniden göstermeniz gerektiğinde, $ el mevcut olmaz.
JJ

@Markionette gibi kompozit mimari kullanıyorsam .... yine de view'in eline ihtiyacım var mı?
afr0

bağlantı jsfiddle.net/hRndn
Izzy

@Mahi Evet haklısın. Muhtemelen yanlış bağlantı yapıştırdım, üzgünüm. Bu işe yarıyor: jsfiddle.net/hRndn/127
Izzy

1

'El'inizin, görünümünüzde bir değişikliği tetikleyen herhangi bir olaya sahip bir alt öğe içeren bir öğeye başvurmasını istiyorsunuz. "Body" etiketi kadar geniş olabilir.


Hmm, bu da pek netleşmiyor. Görüşümde bir değişikliği tetikleyebilecek öğeler çoğu zaman görünümün oluşturduğu şablonun içindedir, bu nedenle oluşturulmadan önce bu öğeler henüz mevcut değildir.
Manuel Meurer
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.