Спинка. Перегляньте плутанину "el"


97

Як слід elобробляти подання ? Це має бути встановлено, інакше події не спрацьовують (див. Тут ).

Але чи повинен це бути елемент, який вже є на сторінці? У своєму додатку я перетворюю шаблон (шаблони jQuery) у Fancybox. Що повинно elбути в такому випадку?


11
Я подумав - я єдиний, хто морочиться з elріччю.
Югал Джиндл

elце як gf. їх ніхто не може зрозуміти повною мірою.
Махі

Відповіді:


121

Подання el - це те, де відбувається вся прив'язка події. Вам не потрібно його використовувати, але якщо ви хочете, щоб магістраль запускала події, вам потрібно зробити свою роботу з рендерингом на el. Подання el - це елемент DOM, але він не повинен бути попередньо існуючим. Він буде створений, якщо ви не витягнете його зі своєї поточної сторінки, але вам доведеться вставити його на сторінку, якщо ви хочете бачити, як вона робить щось.

Приклад: у мене є вид, який створює окремі елементи

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);
    }
});

Перший вигляд просто створює елементи списку, а другий перегляд фактично розміщує їх на сторінці. Я думаю, це досить схоже на те, що відбувається в прикладі ToDo на сайті backbone.js. Я думаю, що умовою є передати вам вміст в ель. Тож ель служить місцем посадки або контейнером для розміщення шаблону. Потім магістраль прив'язує свої події до даних моделі всередині нього.

При створенні вистави можна маніпулювати ел чотирма способами , використовуючи el:, tagName:, className:і id:. Якщо жодне з них не оголошено el за замовчуванням є div без ідентифікатора або класу. У цей момент він також не пов’язаний зі сторінкою. Ви можете змінити тег на щось інше, використовуючи tagName (наприклад tagName: "li", це дасть вам змогу <li></li>). Ви також можете встановити ідентифікатор та клас el. Все-таки el не є частиною вашої сторінки. Властивість el дозволяє виконувати дуже дрібні маніпуляції із зерном об’єкта el. Більшу частину часу я використовуюel: $("someElementInThePage")який фактично пов'язує всі маніпуляції, які ви робите, у вашому поданні до поточної сторінки. В іншому випадку, якщо ви хочете, щоб уся важка робота, яку ви зробили у своєму огляді, відображалася на сторінці, вам потрібно буде вставити / додати її на сторінку десь ще у вашому перегляді (можливо, у візуалізації). Мені подобається думати про el як про контейнер, яким маніпулює весь ваш погляд.


Дякуємо за роз’яснення та приклад! Я думаю, що не завжди зрозуміло, яким повинен бути ел в певних ситуаціях, і розробник повинен отримати "відчуття" для цього. Ваші пояснення безумовно допомогли! Хоча одне питання: ви не визначаєте el у вашому ItemView, але ви отримуєте доступ до нього у функції візуалізації. Чи буде це працювати? Чи є якийсь el за замовчуванням, якщо ви прямо не визначите його?
Мануель Меурер

3
За замовчуванням el - тег "div" без ідентифікатора чи класу. Це об'єкт DOM, не пов'язаний із вашою сторінкою DOM. Зазвичай я вставляю / додаю її на сторінку у функції візуалізації або функції візуалізації батьківського подання.
LeRoy

Оновив мою відповідь деяким описом властивостей, які визначають ел.
LeRoy

5
Я думаю, моя єдина проблема із захопленням вже існуючого елемента з el: $ ("# someElementID") полягає в тому, що ваш погляд, мабуть, знає більше, ніж повинен, ускладнюючи його повторне використання. дивіться "Розгорнути подання від DOM ..." coenraets.org/blog/2012/01/…
Скотт Коутс

@scoarescoare, оскільки ви додаєте властивість el при створенні інстанції, сам вигляд насправді не знає більше, ніж слід, він залишається модульним і здатний прийняти будь-який $ (el), який ви хочете передати. Отже, це робить його досить багаторазовим.
Метаграф

6

Трохи старий зараз, але я також розгубився, і тому для інших людей, які потрапляють сюди, ця скрипка може допомогти - 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();
});

Я дотримувався цієї моделі і хотів би цього не зробити. Щоб знищити вигляд і видалити прив’язки, умовою основи є view.remove (). Це знищує $ el і видаляє його з DOM, тому коли вам потрібно знову показати погляд, $ el не існує.
JJ

@ Призначте, що якщо я використовую композиційну архітектуру, як маріонетка .... мені все-таки потрібно мати el?
afr0

ваш скрипковий код не працює, оскільки посилання має бути jsfiddle.net/hRndn
Izzy

@Mahi Так, ви праві. Можливо, я вставив неправильне посилання, вибачте. Це працює: jsfiddle.net/hRndn/127
Іззі

1

Ви хочете, щоб ваш 'el' посилався на елемент, який містить дочірній елемент, який має будь-яку подію, яка викликає зміну у вашому погляді. Може бути таким широким, як тег "body".


Хм, це насправді теж не зрозуміло. У більшості випадків елементи, які могли викликати зміну в моєму представленні, знаходяться всередині шаблону, який подає подання, тому до його виведення ці елементи ще не існують.
Мануель Мюрер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.