ぼかしイベントを手動で追跡せずに、フォーム入力をbackbone.jsのモデルにバインドできますか?
-
28-09-2019 - |
質問
backbone.jsアプリがあります(www.github.com/juggy/job-board)フォーム入力をモデルに直接バインドしたい場合(スプラウトコア)。
入力上の各ぼかしイベントを実際に追跡してモデルを手動で更新することなく、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を持つ入力要素に依存しています。
これは、入力要素からオブジェクトを作成するためのよりクリーンな(そしておそらくより高速な)方法だと思います
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);
},
backbone.modelbinderを試しましたか?必要なことをするのに最適なツール: https://github.com/theironcook/backbone.modelbinder
Django Formsモジュールに触発されたBackbone.jsのフォームライブラリであるCorsetに取り組んでいますが、範囲は少し野心的ではありません。まだねじれを解決していますが、少なくとも半安定して機能的な場合、それはgithubで終わるでしょう。
コルセットの目的は、より複雑なユースケース(カスケードセレクトなど)のために複雑な入力を構築できるように、フィールドクラスを簡単にサブクラス化することです。このアプローチは、各フィールドを個別のビューとしてレンダリングし、フォームビューはモデルにバインドされ、変更イベント、ぼかし、またはイベントを提出してモデルを更新します(設定可能、ぼかしはデフォルトです)。各ビューには、デフォルトごとにjQuery .val()関数にマップするオーバードライブ可能なgetData関数があります。
Sensible DefaultsとModelformFactory関数を使用して、迅速な開発のためにCorset(または実際に行われているサブセット)を使用し、Sensible属性名を使用してモデルを定義し、ModElformFactoryを使用し、UIを即座に編集します。
私は自分のサイトで次の手法を作成しました
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/
属性をモデル化するために、バインディングフォーム要素のイベントプロパティと同じ宣言スタイルを使用します
そして、これが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
@
coffeescriptが気に入らない場合はアポロジー。そうです。誰もが違う:)