2010-11-02 105 views

回答

34

我不知道SC是怎麼做的,但可能他們監聽事件了。

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

我最終做到了這一點。迄今爲止,我工作得很好。正如你所說,它可以節省輸入上的每一個變化。然後立即顯示錯誤,這是好的和壞的(未修改的字段會顯示錯誤,如創建記錄時不能爲空)。 – Julien 2010-11-10 16:27:38

+2

1.也可以嘗試模糊事件。 2.我一直在思考這個問題,有一個「綁定」數組與類似於「事件」散列的指令會很有用,它指定視圖部分和帶有同步類型參數的模型屬性之間的更新(at_change,at_blur等) 。說'類似'綁定:[[「div#title」,「model.title」,「change」,「< - 」],[「input#description」,「model.description」,「change」,「<->」 ]]或類似的東西,它應該很容易實現。 – clyfe 2010-11-10 22:00:52

+0

我想你可以使用Handlebar.js作爲模板引擎。它有這種綁定。 – Julien 2010-11-30 02:12:41

52

如果你的模型包含很多屬性,還有更好的方法來處理這個問題。

SampleView = Backbone.View.extend({ 
    el: "#formEl", 

    events: { 
     "change input": "changed", 
     "change select": "changed" 
    }, 

    initialize: function() { 
     _.bindAll(this, "changed"); 
    }, 

    changed:function (evt) { 
     var changed = evt.currentTarget; 
     var value = $(evt.currentTarget).val(); 
     var obj = {}; 
     obj[changed.id] = value; 
     this.model.set(obj); 
    } 
}); 

有一個依賴於您的輸入元素有一個id與您的模型中的屬性的名稱相同。

+1

Would var obj = {} [changed.id] = value;工作比:var obj =「{\」「+ changed.id +」\「:\」「+ value +」\「}」; var objInst = JSON.parse(obj); – btiernay 2012-05-18 02:45:57

+0

你永遠不應該依賴如下內容:'「{\」「+ changed.id +」\「:\」「+ value +」\「}」'如果必須的話,至少需要序列化/轉義值字符串。 – LoG 2012-07-05 12:56:52

+0

這個相同的想法已作爲插件增強和實現:http://lostechies.com/derickbailey/2011/07/24/awesome-model-binding-for-backbone-js/ – JamieJag 2014-02-03 10:38:19

18

我覺得這是一個更清潔的(也許更快)的方式來從輸入元素

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

創建一個對象而jQuery的:

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

您不需要將對象傳遞給model.set()。換句話說,你可以使用下面的代碼:this.model.set(target.name,target.value); – 2012-11-20 00:11:51

1

我工作的束腹,一種形式backbone.js的庫靈感來自於django的表單模塊,但是在範圍上有點不那麼雄心勃勃。仍然在努力解決這個問題,但至少在半穩定和功能性方面它會在Github上結束。

緊身胸衣的目的是有輕鬆的子類的領域類,以便您可以構建複雜的輸入更復雜的用例(級聯選擇等)。此方法將每個字段呈現爲單獨的視圖,而表單視圖綁定到模型並使用更改事件,模糊事件或提交事件以更新模型(可配置,模糊爲默認)。每個視圖都有一個可覆蓋的getData函數,它默認映射到jquery .val()函數。

使用敏感的默認值和modelFormFactory函數,我們使用corset(或實際完成的子集)進行快速開發,使用敏感屬性名稱定義模型,使用modelFormFactory並且您有即時編輯UI。

+0

我想看這個圖書館!它可用嗎? – bradgonesurfing 2011-06-12 08:22:53

+0

不幸的是,它還沒有準備好供一般消費,但我們希望在8月份之前完成它(在我可以花時間清理並正確推廣它之前,請先發貨產品) – 2011-06-14 22:03:32

0

我創建了下面的技術在我的網站

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) 

我已經詳細介紹您需要在我的博客擴展到骨幹

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

它使用相同的聲明風格將表單元素 綁定到模型屬性的事件屬性

並且這裏是實際的代碼在你的咖啡文本中實現你的類

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 

    @ 

如果你不喜歡coffeescript,我做。每個人都不同:)

+8

發佈生成的輸出並不特別對於任何大小的CoffeeScript示例都很有幫助 - 由於輸出僅用於解釋器,而不是用於閱讀,因此難以閱讀。你永遠不會用手寫JavaScript。出於這個原因,讓我感到困惑的是,許多Coffeescript示例最終以習慣的「JavaScript - eww!」來做到這一點。 – 2011-06-12 11:35:38

+7

這幾天你不能讓任何人開心。只是發佈咖啡腳本raymond抱怨。做一個編輯,幷包括翻譯和insin抱怨。考慮到這個問題是關於形式綁定的主幹,我的回答是關於主題,可能是最習慣的主幹解決方案。問題是關於jquery和backbone而不是javascript。 – bradgonesurfing 2011-06-12 13:09:49

+0

這些天骨幹是舊帽子。如果你想要超強力的綁定,你應該使用angularjs。 – bradgonesurfing 2013-04-01 08:45:28

相關問題