1

canJS で (単一のリクエストで) 関連付けを使用してモデルをロードする方法のデモを次に示します。canJS の github リポジトリ(こちら)で見つけましたが、実際には動作するように少し書き直す必要がありました (時代遅れでした) が、現在は動作しています。

私の問題は、ロードされた連絡先を変更した場合 ( contact.attr('name', 'Tom');)、それを保存したい場合 ( contact.save();)、連絡先と連絡先のタスクが ajax 経由でサーバーに投稿され、保存されることです。tasksは の属性であるため、これは論理的ですcontact

私の問題は、連絡先のみが必要でnameありbirthdayidレコードを更新するときに投稿されることです。おそらくmakeRequestメソッドをオーバーライドし、サーバーに投稿する前に削除するtasks必要がありますが、もっと洗練された解決策があるはずです。

願わくば、すでにこの状況に対処した canJS ユーザーがここにいることを願っています。

4

1 に答える 1

4

私はまさにこの問題の解決策を自分で探していました。モデル メソッドを変更して Rails でより適切に動作するようにすることについて、この記事の JavascriptMVC フォーラムでのトリッキーの提案に触発されて、独自の解決策を思いつきました。serialize()

彼の提案のように、Model クラスの独自の拡張機能を作成し、include含めたい属性をリストできるフィールドをモデルに追加しました (Rails の as_json メソッドの後にパターン化)。

can.Model("BaseModel", {}, {
  serialize: function() {
    var data, retval, serialized;
    data = {};
    retval = {};
    serialized = can.Model.prototype.serialize.call(this);
    //check if we're using the "include" fields or not
    if (typeof this.constructor.include !== 'undefined') {
      can.each(this.constructor.include, function(attr) {
        data[attr] = serialized[attr];
      });
    } else {
      data = serialized;
    }
    //wrap the return value in the model name for Rails purposes, e.g. {"event": {data}}
    retval[this.constructor._shortName] = data;
    return retval;
  }
});

次に、モデルで「include」配列を使用して、含めたいフィールドを示します。"attendees" と "speakers" を省略すると、これらの関連モデルは、サーバーに送り返されるシリアル化された JSON にパッケージ化されません。

Event = BaseModel.extend('Event', {
  findAll: "GET /admin/events",
  findOne: "GET /admin/events/{id}",
  create: "POST /admin/events",
  update: "PUT /admin/events/{id}",
  destroy: "DELETE /admin/events/{id}",
  attributes: {
    attendees: 'Models.User.models',
    speakers: 'Models.User.models'
  },
  include: ['id', 'name', 'start_time', 'end_time']
}, {});
于 2013-02-12T11:19:36.843 に答える