2010-11-02 25 views
62

Tôi có ứng dụng backbone.js (www.github.com/juggy/job-board) nơi tôi muốn ràng buộc biểu mẫu nhập của tôi trực tiếp vào mô hình của tôi (la la Sproutcore).Tôi có thể liên kết đầu vào biểu mẫu với các mô hình trong Backbone.js mà không theo dõi các sự kiện mờ theo cách thủ công không?

Có thể với Backbone.js (hoặc các công cụ khác) mà không thực sự theo dõi từng sự kiện mờ trên đầu vào và cập nhật mô hình theo cách thủ công không? Điều này có vẻ như rất nhiều mã keo.

Cảm ơn,
Julien

Trả lời

34

Tôi không chắc chắn như thế nào SC thực hiện nó nhưng có lẽ họ nghe cho các sự kiện quá.

window.SomeView = Backbone.View.extend({ 
    events: { 
    "change input.content": "contentChanged" 
    }, 
    initialize: function() { 
    _.bindAll(this, 'contentChanged'); 
    this.inputContent = this.$('input.content'); 
    }, 
    contentChanged: function(e) { 
    var input = this.inputContent; 

    // if you use local storage save 
    this.model.save({content: input.val()}); 

    // if you send request to server is prob. good idea to set the var and save at the end, in a blur event or in some sync. maintenance timer. 
    // this.model.set({content: input.val()}); 
    } 
}); 
+0

Tôi đã làm chính xác điều đó. Tôi làm việc tuyệt vời cho đến nay. Như bạn đã nói, nó tiết kiệm cho mọi thay đổi về đầu vào. Các lỗi sau đó được hiển thị ngay lập tức, đó là tốt và xấu (các trường chưa sửa đổi sẽ hiển thị lỗi như không thể để trống khi tạo bản ghi). – Julien

+2

1. người ta cũng có thể thử sự kiện mờ. 2. Tôi đã cân nhắc về vấn đề này, sẽ rất hữu ích khi có một mảng "bindings" tương tự như hash "events" chỉ định các cập nhật giữa các phần view và các thuộc tính mô hình với các tham số kiểu đồng bộ (at_change, at_blur, vv) . nói tương tự với 'bindings: [[" div # title "," model.title "," change "," <- "], [" input # description "," model.description "," change "," <-> " ]] 'hoặc một cái gì đó như thế, nó sẽ khá dễ thực hiện. – clyfe

+0

Tôi nghĩ bạn có thể sử dụng Handlebar.js làm công cụ tạo khuôn mẫu. Nó có loại ràng buộc này. – Julien

52

Có một cách hay hơn để xử lý nếu mô hình của bạn có nhiều thuộc tính trong đó.

Có sự phụ thuộc vào các yếu tố đầu vào của bạn có id giống với tên của thuộc tính trong mô hình của bạn.

+1

Biến var obj = {} [changed.id] = value; hoạt động tốt hơn: var obj = "{\" "+ changed.id +" \ ": \" "+ giá trị +" \ "}"; var objInst = JSON.parse (obj); – btiernay

+0

Bạn không bao giờ nên dựa vào một cái gì đó như: '" {\ "" + changed.id + "\": \ "" + giá trị + "\"} "' ít nhất là tuần tự hóa/thoát chuỗi giá trị nếu bạn phải. – LoG

+0

Ý tưởng tương tự này đã được tăng cường và triển khai như một trình cắm thêm: http://lostechies.com/derickbailey/2011/07/24/awesome-model-binding-for-backbone-js/ – JamieJag

18

Tôi nghĩ rằng đây là một trình dọn dẹp (và có thể nhanh hơn) cách để tạo ra một đối tượng từ một yếu tố đầu vào

changed: function(evt) { 
    var target = $(evt.currentTarget), 
     data = {}; 
    data[target.attr('name')] = target.val(); 
    this.model.set(data); 
}, 

mà không jquery:

changed: function(evt) { 
    var target = evt.currentTarget, 
     data = {}; 
    data[target.name] = target.value; 
    this.model.set(data); 
}, 
+2

Bạn không cần truyền đối tượng đến model.set(). Nói cách khác, bạn có thể sử dụng như sau: this.model.set (target.name, target.value); –

1

tôi đang làm việc trên corset, một hình thức thư viện cho backbone.js lấy cảm hứng từ mô-đun hình thức django, nhưng một chút ít tham vọng trong phạm vi. Vẫn làm việc ra các kinks, nhưng nó sẽ kết thúc trên github khi ít nhất là bán ổn định và chức năng.

Mục đích của corset là có các lớp trường được phân lớp dễ dàng để bạn có thể tạo các đầu vào phức tạp cho các trường hợp sử dụng phức tạp hơn (các lựa chọn xếp tầng, v.v ...). Cách tiếp cận này ám chỉ mỗi trường dưới dạng một khung nhìn riêng biệt và khung nhìn biểu mẫu được ràng buộc với một mô hình và sử dụng các sự kiện thay đổi, sự kiện mờ hoặc gửi các sự kiện để cập nhật mô hình (cấu hình, làm mờ là mặc định). Mỗi khung nhìn có một hàm getData có thể ghi đè trên mỗi bản đồ mặc định cho hàm jquery .val().

Sử dụng mặc định hợp lý và chức năng modelFormFactory, chúng tôi sử dụng corset (hoặc tập con của nó thực sự được thực hiện) để phát triển nhanh, xác định mô hình sử dụng tên thuộc tính hợp lý, sử dụng modelFormFactory và bạn có giao diện người dùng chỉnh sửa tức thì.

+0

Tôi muốn xem thư viện này! Nó có sẵn chưa? – bradgonesurfing

+0

Thật không may là nó chưa sẵn sàng để tiêu thụ chung, nhưng chúng tôi hy vọng sẽ có nó lên bởi tháng tám (phải vận chuyển sản phẩm đầu tiên trước khi tôi có thể dành thời gian để làm sạch nó và tổng quát nó) –

0

tôi tạo ra các kỹ thuật sau đây trên trang web của tôi

class FooView extends MyView 

    tag: "div" 

    modelBindings: 

    "change form input.address" : "address" 
    "change form input.name" : "name" 
    "change form input.email" : "email" 

    render: -> 

    $(@el).html """ 
     <form> 
     <input class="address"/> 
     <input class="name"/> 
     <input class="email"/> 
     </form> 
    """ 

    super 

    @ 


# Instantiate the view 
view = new FooView 
    model: new Backbone.Model 

$("body").html(view.el) 

Tôi đã trình bày chi tiết các phần mở rộng để xương sống bạn cần phải thực hiện trên blog của tôi

http://xtargets.com/2011/06/11/binding-model-attributes-to-form-elements-with-backbone-js/

nó sử dụng phong cách tường thuật tương tự như thuộc tính sự kiện cho các phần tử biểu mẫu ràng buộc để mô hình các thuộc tính

và đây là mã thực tế triển khai lớp học cho bạn trong coffeescript

class MyView extends Backbone.View 

    render: -> 

    if @model != null 
     # Iterate through all bindings 
     for selector, field of @modelBindings 
     do (selector, field) => 
      console.log "binding #{selector} to #{field}" 
      # When the model changes update the form 
      # elements 
      @model.bind "change:#{field}", (model, val)=> 
      console.log "model[#{field}] => #{selector}" 
      @$(selector).val(val) 

      # When the form changes update the model 
      [event, selector...] = selector.split(" ") 
      selector = selector.join(" ") 
      @$(selector).bind event, (ev)=> 
      console.log "form[#{selector}] => #{field}" 
      data = {} 
      data[field] = @$(ev.target).val() 
      @model.set data 

      # Set the initial value of the form 
      # elements 
      @$(selector).val(@model.get(field)) 

    super 

    @ 

Ứng dụng nếu bạn không thích coffeescript. Tôi làm. Mọi người đều khác nhau :)

+8

Đăng đầu ra được tạo ra không đặc biệt hữu ích cho các ví dụ CoffeeScript với bất kỳ kích thước nào - nó rất xấu và khó đọc vì đầu ra dành cho một thông dịch viên, không phải để đọc. Bạn sẽ không bao giờ viết JavaScript theo cách đó. Vì lý do đó, nó làm tôi bối rối khi có rất nhiều ví dụ Coffeescript làm điều này ở phần cuối với thông lệ "JavaScript - eww!" –

+7

Bạn không thể làm cho bất cứ ai hạnh phúc trong những ngày này. Chỉ cần đăng coffeescript raymond than phiền. Thực hiện chỉnh sửa và bao gồm các bản dịch và insin than phiền. Cho rằng câu hỏi là về hình thức ràng buộc trong xương sống câu trả lời của tôi là về chủ đề và có lẽ là giải pháp xương sống thành ngữ nhất. Câu hỏi là về jquery và xương sống không javascript cụ thể. – bradgonesurfing

+0

Xương sống là chiếc mũ cũ những ngày này. Bạn nên sử dụng angularjs nếu bạn muốn ràng buộc siêu hỗ trợ. – bradgonesurfing

Các vấn đề liên quan