2011-02-26 11 views
0

Backbone.jsjquery.datalink.jsを一緒に使用して、バックボーンモデルを一連のフィールドにリンクすることはできますか?Backbone.jsとjquery.datalink.jsの使用

<div id="person"> 
    <label for="name">Name:</label> 
    <input type="text" name="name" id="name" /> 
</id> 

var m = Backbone.Model.extend({}); 

はできることを一つのセンスを作る(ただし機能しない)ようだ: "機能しない" と

$("#person").link(m); 

を与え例えば

、つまり、モデルを変更すると、リンクは入力フィールドを更新しないということです。入力フィールドを変更すると、モデルは更新されません。

私はthis on jsFiddleと改造してきましたが、役に立たないです。確かに、データリンクプラグインは実際には文書化されているようには動作していないようです(私がエラーを出さない限り)。

データリンクがこれに適していない場合は、代替案の提案をお願いします。

私は思考やフィードバックに感謝します。

+1

データリンクは使用されませんでしたが、バックボーンモデルは.get( 'field')によってアクセスされるため、そのままでは動作しません。モデルのget/setメソッドを使用するには、リンクにコンバータを実装する必要があります。 – Julien

+0

@Julien:ヒントをいただきありがとうございます - 私はそれを気づいて気づいています。 :)私は、コンバータを書くのに苦労するつもりなら、データリンクのメリットがどういうものだろうと思っています。 –

+0

私は通常、バックボーン内の{"change input、textarea、select": "update_model"}のような変更イベントをチェックし、その後にモデルに値を割り当てます。後でこのモデルを変更するイベントを聞いて、このフィールドを再作成するためにレンダリングを使用します。this.model.bind( "change"、this.oh_oh_change) – Julien

答えて

1

私は、データリンクプラグインを使用していないが、これはこの種のは、カプセル化の原則に違反する...

を助けるかもしれませんが、あなたはバックボーンモデル内model.attributesオブジェクトを使用することができます。

そのため、おそらくこのような何か:

$("#person").link(m.attributes); 

また、あなたがBackbone.Modelをインスタンス化するとき、それは次のようになります。あなたが実際に新しいコンストラクタ(のようなを作成Backbone.Model.extend呼び出すと

var m = new Backbone.Model(); 

新しいクラス)であり、オブジェクトインスタンスではありません。

1

@Samが提供する解決策は期待されていますが、注意する必要がある関連する問題があります。バックボーンモデルは観測可能です。モデル内のイベントを変更するために関数をバインドすることができます。これらのイベントは、Backboneによって提供されるラッパーのgetter関数とsetter関数によってトリガーされます。これらのgetterとsetterをバイパスすると、model.attributesを直接使用すると、データが変更されたときにイベントがトリガされません。 あなたのデータリンクの関連付けが単方向である場合、これは問題ではありません。 javascriptオブジェクトが変更されるとビューが変更されますが、双方向データリンクを実装する場合は、ビューがユーザーによって操作されるとモデル属性は変更されますが、対応するセッターは使用されていないため、残りのアプリケーションコードに変更が通知されません。これにより、問題をデバッグするのが困難になることがあります。 データバインディングが主な関心事である場合は、最先端のデータリンク機能を備えたKnockoutJSを検討してください。

関連する問題