我有一個backbone.js應用程序(www.github.com/juggy/job-board),我想直接將我的表單輸入綁定到我的模型(一個Sproutcore)。我可以將表單輸入綁定到Backbone.js中的模型而無需手動跟蹤模糊事件嗎?
Backbone.js(或其他工具)可能不實際跟蹤輸入上的每個模糊事件並手動更新模型嗎?這看起來像很多膠水代碼。
感謝,
朱利安
我有一個backbone.js應用程序(www.github.com/juggy/job-board),我想直接將我的表單輸入綁定到我的模型(一個Sproutcore)。我可以將表單輸入綁定到Backbone.js中的模型而無需手動跟蹤模糊事件嗎?
Backbone.js(或其他工具)可能不實際跟蹤輸入上的每個模糊事件並手動更新模型嗎?這看起來像很多膠水代碼。
感謝,
朱利安
我不知道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()});
}
});
如果你的模型包含很多屬性,還有更好的方法來處理這個問題。
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與您的模型中的屬性的名稱相同。
Would var obj = {} [changed.id] = value;工作比:var obj =「{\」「+ changed.id +」\「:\」「+ value +」\「}」; var objInst = JSON.parse(obj); – btiernay 2012-05-18 02:45:57
你永遠不應該依賴如下內容:'「{\」「+ changed.id +」\「:\」「+ value +」\「}」'如果必須的話,至少需要序列化/轉義值字符串。 – LoG 2012-07-05 12:56:52
這個相同的想法已作爲插件增強和實現:http://lostechies.com/derickbailey/2011/07/24/awesome-model-binding-for-backbone-js/ – JamieJag 2014-02-03 10:38:19
我覺得這是一個更清潔的(也許更快)的方式來從輸入元素
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);
},
您不需要將對象傳遞給model.set()。換句話說,你可以使用下面的代碼:this.model.set(target.name,target.value); – 2012-11-20 00:11:51
我工作的束腹,一種形式backbone.js的庫靈感來自於django的表單模塊,但是在範圍上有點不那麼雄心勃勃。仍然在努力解決這個問題,但至少在半穩定和功能性方面它會在Github上結束。
緊身胸衣的目的是有輕鬆的子類的領域類,以便您可以構建複雜的輸入更復雜的用例(級聯選擇等)。此方法將每個字段呈現爲單獨的視圖,而表單視圖綁定到模型並使用更改事件,模糊事件或提交事件以更新模型(可配置,模糊爲默認)。每個視圖都有一個可覆蓋的getData函數,它默認映射到jquery .val()函數。
使用敏感的默認值和modelFormFactory函數,我們使用corset(或實際完成的子集)進行快速開發,使用敏感屬性名稱定義模型,使用modelFormFactory並且您有即時編輯UI。
我想看這個圖書館!它可用嗎? – bradgonesurfing 2011-06-12 08:22:53
不幸的是,它還沒有準備好供一般消費,但我們希望在8月份之前完成它(在我可以花時間清理並正確推廣它之前,請先發貨產品) – 2011-06-14 22:03:32
我創建了下面的技術在我的網站
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,我做。每個人都不同:)
發佈生成的輸出並不特別對於任何大小的CoffeeScript示例都很有幫助 - 由於輸出僅用於解釋器,而不是用於閱讀,因此難以閱讀。你永遠不會用手寫JavaScript。出於這個原因,讓我感到困惑的是,許多Coffeescript示例最終以習慣的「JavaScript - eww!」來做到這一點。 – 2011-06-12 11:35:38
這幾天你不能讓任何人開心。只是發佈咖啡腳本raymond抱怨。做一個編輯,幷包括翻譯和insin抱怨。考慮到這個問題是關於形式綁定的主幹,我的回答是關於主題,可能是最習慣的主幹解決方案。問題是關於jquery和backbone而不是javascript。 – bradgonesurfing 2011-06-12 13:09:49
這些天骨幹是舊帽子。如果你想要超強力的綁定,你應該使用angularjs。 – bradgonesurfing 2013-04-01 08:45:28
您是否嘗試過Backbone.ModelBinder?這是一個很好的工具來做你所需要的:https://github.com/theironcook/Backbone.ModelBinder
我最終做到了這一點。迄今爲止,我工作得很好。正如你所說,它可以節省輸入上的每一個變化。然後立即顯示錯誤,這是好的和壞的(未修改的字段會顯示錯誤,如創建記錄時不能爲空)。 – Julien 2010-11-10 16:27:38
1.也可以嘗試模糊事件。 2.我一直在思考這個問題,有一個「綁定」數組與類似於「事件」散列的指令會很有用,它指定視圖部分和帶有同步類型參數的模型屬性之間的更新(at_change,at_blur等) 。說'類似'綁定:[[「div#title」,「model.title」,「change」,「< - 」],[「input#description」,「model.description」,「change」,「<->」 ]]或類似的東西,它應該很容易實現。 – clyfe 2010-11-10 22:00:52
我想你可以使用Handlebar.js作爲模板引擎。它有這種綁定。 – Julien 2010-11-30 02:12:41