Cách chuyển các tham số cho một dạng xem


93

Tôi có một loạt các nút mà khi nhấp vào sẽ hiển thị một menu bật lên được đặt ngay bên dưới nút. Tôi muốn chuyển vị trí của nút sang chế độ xem. Làm thế nào tôi có thể làm điều đó?

ItemView = Backbone.View.extend({
    tagName: 'li',
    events: {
        'click': 'showMenu'
    },
    initialize: function() {
        _.bindAll(this, 'render');
    },
    render: function() {
    return $(this.el).html(this.model.get('name'));
    },
    showMenu: function() {
        var itemColl = new ItemColl();
        new MenuView({collection: itemColl}); // how to pass the position of menu here?
    }
});

Câu trả lời:


168

Bạn chỉ cần truyền tham số bổ sung khi bạn xây dựng MenuView. Không cần thêm initializechức năng.

new MenuView({
  collection: itemColl,
  position: this.getPosition()
})

Và sau đó, trong MenuView, bạn có thể sử dụng this.options.position.

CẬP NHẬT:@mu là trạng thái quá ngắn , kể từ 1.1.0, Chế độ xem đường trục không còn tự động đính kèm các tùy chọn được chuyển cho hàm khởi tạo dưới dạng tùy chọn này, nhưng bạn có thể tự làm điều đó nếu muốn.

Vì vậy, trong initializephương thức của bạn , bạn có thể lưu giá trị optionsđã qua dưới dạng this.options:

initialize: function(options) {
    this.options = options;
    _.bindAll(this, 'render');
},

hoặc sử dụng một số cách tốt hơn như được mô tả bởi @Brave Dave .



1
Điều này hoạt động hoàn hảo, chỉ cần thêm tham số vào phương thức khởi tạo dạng xem của bạn: khởi tạo: function (options) {alert (options.position); }
Cabuxa.Mapache

@ Cabuxa.Mapache Không, nó không hoạt động. Câu trả lời này sử dụng this.options.position, không options.position. Chế độ xem được sử dụng để đính kèm các initializeđối số this.optionsnhưng điều đó đã ngừng xảy ra trong 1.1.0.
mu quá ngắn

46

Thêm đối số tùy chọn vào initialize:

initialize: function(options) {
    // Deal with default options and then look at options.pos
    // ...
},

Và sau đó chuyển một số tùy chọn khi bạn tạo chế độ xem của mình:

var v = new ItemView({ pos: whatever_it_is});

Để biết thêm thông tin: http://backbonejs.org/#View-constructor


điều này là thanh lịch / đơn giản hơn cho hầu hết các tình huống.
Cullen SUN

@CullenSUN: Cảm ơn. Tôi thích sự rõ ràng của cách tiếp cận này, "hành động ở khoảng cách xa" kỳ diệu khi sử dụng this.optionsmang lại cho tôi những cơn ác mộng duy trì và gỡ lỗi.
mu quá ngắn

Tôi đã nhìn thấy liên kết Backbone đầu tiên nhưng ví dụ của bạn đã làm rõ điều đó cho tôi. Cảm ơn
Manuel Hernandez

Tính năng này đã không còn được dùng nữa và bạn không thể sử dụng nữathis.options
Chuyến đi

4
@Trip: Hả? initialize: function(options) { ... }vẫn ổn, sự thay đổi là Backbone không còn tự động đặt this.optionscho bạn nữa: "Backbone Views không còn tự động đính kèm các tùy chọn được chuyển cho hàm tạo nữa this.options, nhưng bạn có thể tự làm nếu muốn." .
mu quá ngắn

12

Kể từ backbone 1.1.0, optionsđối số không còn được tự động gắn vào chế độ xem (xem vấn đề 2458 để thảo luận). Bây giờ bạn cần đính kèm các tùy chọn của từng chế độ xem theo cách thủ công:

MenuView = Backbone.View.extend({
    initialize: function(options) {
        _.extend(this, _.pick(options, "position", ...));
    }
});

new MenuView({
    collection: itemColl,
    position: this.getPosition(),
    ...
});

Ngoài ra, bạn có thể sử dụng plugin nhỏ này để tự động đính kèm các tùy chọn trong danh sách trắng, như sau:

MenuView = Backbone.View.extend({
    options : ["position", ...] // options.position will be copied to this.position
});

-1

đi từ vị trí khác

 new MenuView({
   collection: itemColl,
   position: this.getPosition()
})

Thêm một đối số tùy chọn để khởi tạo trong dạng xem bạn đang nhận được biến được truyền đó,

initialize: function(options) {
   // Deal with default options and then look at options.pos
   // ...
},

để có được giá trị sử dụng -

   var v = new ItemView({ pos: this.options.positions});

5
viết câu trả lời cải tiến không tập thể.
Konga Raju

Đây là câu trả lời được cải thiện!
Imtiaz Mirza

-2

Sử dụng this.options để truy xuất đối số trong chế độ xem

 // Place holder
 <div class="contentName"></div>

 var showNameView = Backbone.View.extend({
        el:'.contentName',
        initialize: function(){
            // Get name value by this.options.name
            this.render(this.options.name);
        },
        render: function(name){
            $('.contentName').html(name);
        }
    });

    $(document).ready(function(){
        // Passing name as argument to view
        var myName1 = new showNameView({name: 'Nishant'});
    });

Ví dụ làm việc: http://jsfiddle.net/Cpn3g/1771/

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.