Backbone.Xem nhầm lẫn "el"


97

Một lượt xem elnên được xử lý như thế nào? Nó phải được thiết lập, nếu không các sự kiện không kích hoạt (xem tại đây ).

Nhưng nó có phải là một phần tử đã có trên trang không? Trong ứng dụng của mình, tôi kết xuất một mẫu (jQuery Templates) vào Fancybox. Điều gì nên elđược trong trường hợp đó?


11
Tôi nghĩ - tôi là người duy nhất đang loay hoay với elđiều này.
Yugal Jindle

elgiống như gf. không ai có thể hiểu chúng một cách đầy đủ.
Mahi

Câu trả lời:


121

Một khung nhìn el là nơi tất cả các ràng buộc sự kiện diễn ra. Bạn không cần phải sử dụng nó nhưng nếu bạn muốn xương sống để kích hoạt các sự kiện, bạn cần thực hiện công việc kết xuất của mình trên el. Chế độ xem el là một phần tử DOM nhưng nó không nhất thiết phải là một phần tử có từ trước. Nó sẽ được tạo nếu bạn không lấy một cái từ trang hiện tại của mình, nhưng bạn sẽ phải chèn nó vào trang nếu bạn muốn xem nó làm bất cứ điều gì.

Ví dụ: Tôi có một chế độ xem tạo các mục riêng lẻ

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

Chế độ xem đầu tiên chỉ tạo các mục danh sách và chế độ xem thứ hai thực sự đặt chúng trên trang. Tôi nghĩ điều này khá giống với những gì xảy ra trong ví dụ Công việc trên trang backbone.js. Tôi nghĩ quy ước là làm cho bạn hài lòng với el. Vì vậy, el đóng vai trò như một nơi hạ cánh hoặc một nơi chứa để đặt nội dung mẫu của bạn. Sau đó, Backbone liên kết các sự kiện của nó với dữ liệu mô hình bên trong nó.

Khi bạn tạo một cái nhìn, bạn có thể thao tác các el trong bốn cách sử dụng el:, tagName:, className:, và id:. Nếu không có cái nào trong số này được khai báo thì mặc định là div không có id hoặc lớp. Nó cũng không được liên kết với trang vào thời điểm này. Bạn có thể thay đổi thẻ thành một cái gì đó khác bằng cách sử dụng tagName (ví dụ: tagName: "li"sẽ cung cấp cho bạn một số <li></li>). Bạn có thể đặt id và class của el tương tự như vậy. El vẫn chưa phải là một phần của trang của bạn. Thuộc tính el cho phép bạn thực hiện thao tác xử lý hạt rất mịn của đối tượng el. Hầu hết thời gian tôi sử dụng mộtel: $("someElementInThePage")điều này thực sự liên kết tất cả các thao tác bạn thực hiện trong chế độ xem của bạn với trang hiện tại. Mặt khác, nếu bạn muốn thấy tất cả công việc khó khăn bạn đã làm trong chế độ xem của mình hiển thị trên trang, bạn sẽ cần chèn / nối nó vào trang ở một nơi khác trong chế độ xem của bạn (có thể là trong kết xuất). Tôi thích nghĩ về el là vật chứa mà tất cả các góc nhìn của bạn điều khiển.


Cảm ơn vì đã làm rõ và ví dụ! Tôi nghĩ rằng không phải lúc nào cũng rõ ràng những gì el nên có trong một số tình huống nhất định và nhà phát triển phải có "cảm giác" với nó. Giải thích của bạn chắc chắn đã giúp! Tuy nhiên, một câu hỏi: bạn không xác định el trong ItemView của mình, nhưng bạn truy cập nó trong hàm kết xuất. Điều này sẽ hoạt động? Có một số loại el mặc định nếu bạn không xác định rõ ràng nó?
Manuel Meurer

3
Theo mặc định, el là thẻ "div" không có id hoặc lớp. Nó là một đối tượng DOM không bị ràng buộc với DOM trang của bạn. Thông thường tôi chèn / nối nó vào trang trong chức năng kết xuất hoặc chức năng kết xuất của chế độ xem chính.
LeRoy

Cập nhật câu trả lời của tôi với một số mô tả về các thuộc tính xác định el.
LeRoy

5
Tôi đoán vấn đề duy nhất của tôi với việc lấy một phần tử có từ trước với el: $ ("# someElementID") là chế độ xem của bạn có thể biết nhiều hơn mức cần thiết, gây khó khăn cho việc sử dụng lại nó. xem "Decouple view from DOM ..." coenraets.org/blog/2012/01/…
Scott Coates

@scoarescoare vì bạn đang thêm thuộc tính el khi khởi tạo, bản thân chế độ xem không thực sự biết nhiều hơn những gì cần thiết, nó vẫn mang tính mô-đun và có thể chấp nhận bất kỳ $ (el) nào bạn muốn chuyển nó. Vì vậy, điều này làm cho nó khá có thể tái sử dụng, thực sự.
Metagrapher

6

Bây giờ hơi cũ, nhưng tôi cũng bối rối và vì vậy đối với những người khác đến đây, trò chơi này có thể giúp ích - 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();
});

Tôi đã theo mô hình này và ước gì tôi đã không làm. Để hủy một khung nhìn và loại bỏ các ràng buộc, quy ước của backbone là view.remove (). Điều đó sẽ phá hủy $ el và xóa nó khỏi DOM, vì vậy khi bạn cần hiển thị lại chế độ xem, $ el không tồn tại.
JJ

@ Đánh dấu điều gì Nếu tôi đang sử dụng kiến ​​trúc tổng hợp như marionette .... tôi có cần phải có chế độ xem không?
afr0

mã fiddle của bạn không hoạt động, vì liên kết phải là jsfiddle.net/hRndn
Izzy

@Mahi Vâng, bạn nói đúng. Tôi có lẽ đã dán nhầm liên kết, xin lỗi. Cái này hoạt động: jsfiddle.net/hRndn/127
Izzy

1

Bạn muốn 'el' của mình tham chiếu đến một phần tử có chứa phần tử con có bất kỳ sự kiện nào gây ra thay đổi trong chế độ xem của bạn. Có thể rộng bằng thẻ "body".


Hmm, điều đó cũng không thực sự rõ ràng. Hầu hết các lần các phần tử có thể kích hoạt thay đổi trong chế độ xem của tôi đều nằm bên trong mẫu, chế độ xem hiển thị, vì vậy trước khi hiển thị, các phần tử này chưa tồn tại.
Manuel Meurer
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.