8

この不自然なサンプル コードを使用すると、次のようになります。

var Product = Backbone.Model.extend({
  idAttribute: '_id',
  url: '/rest/product',
});

var Cart = Backbone.Collection.extend({
  model: Product,
  url: '/rest/cart',
});

p1 = new Product({name: 'Keyboard'});
p2 = new Product({name: 'Mouse'});

c = new Cart();
c.add([p1, p2]);
c.sync();

この同じエラーメッセージを中心に展開する投稿がたくさんありますError: A "url" property or function must be specifiedが、私が見つけたものはすべて、適切に、途中で url プロパティまたは関数が定義されていないことの結果です。

どこかでリンクのステップを逃したように感じます。Backbone.js が実際に自動的に設定しない「魔法の」接続/コールバック/プロパティ/属性に暗黙のうちに依存しているのかもしれません。

4

5 に答える 5

7

sync直接電話するべきではないと思います。代わりに探しているのはc.fetch()(またはp1.save(); p2.sav2()、データを送信しようとしている方向に応じて) だと思います。同期は、Backbone がfetch/を実行するために内部で使用するものです (また、その実行方法saveの AJAX の詳細を変更したい場合は、上書きするために同期が存在しますが、それ以外の場合は必要ありません)。

コレクション内のすべてのモデルを簡単に保存したい場合は、Underscore のコレクションに組み込まれたメソッド「invoke」を使用して保存できます (できるはずc.save()ですが、できないと思います)。

 c.invoke('save');
于 2013-01-24T01:12:10.943 に答える
3

最初に一歩下がって、ユースケースと選択したスキーマを調べます。あなたは明らかにユーザーのショッピングカートに商品を追加しようとしています。

私が見る問題は、あなたがカートをコレクションにしたということです。カートを製品のコレクションを含むモデルにすることをお勧めします。

var ProductCollection = Backbone.Collection.extend({
    model : Product
});

var Cart = Backbone.Model.extend({
    url : '/rest/cart',
    defaults : {
        products : new ProductCollection()
    }
});

この新しいスキーマを使用すると、次のことができます。

var c = new Cart();
c.get('products').add([p1, p2]);
c.save();

このスキーマの追加の利点は、顧客ID、カートの作成日など、カートに追加のデータ属性を含めることができることです。

于 2013-01-24T06:44:28.103 に答える
1

このsync()メソッドは、 の単なるプロキシですBackbone.sync

fetch()およびsave()は の便利なメソッドであり、最初の引数 ('read'、'patch'、'update' など) が指定sync()されていると想定できます。sync()

これを自分で呼び出すには、このメソッドを直接呼び出すために、このメソッドのメソッド シグネチャを一致させる必要があります。

Backbone.sync = function(method, model, options)

方法fetch()は次のとおりです (渡された「読み取り」パラメーターとthis、モデルへの参照に注意してください。

this.sync('read', this, options);

方法save()は次のとおりです。

 method = this.isNew() ? 'create' : (options.patch ? 'patch' : 'update');
 if (method === 'patch') options.attrs = attrs;
 xhr = this.sync(method, this, options);
于 2013-01-24T04:25:52.683 に答える
0

この方法でコレクションを保存することはできません。REST は (単一の) モデルの状態を転送することがすべてであるため、RESTful ではありません。したがって、Backbone.Collection が をサポートしていないのは理にかなっていsave()ます。

.invoke('save')@machineghostが提案したように、 1つの解決策はコレクションを呼び出すことですが、これによりコレクション内のすべてのモデルに対して個別のリクエストが発生することに注意してください! 保存するモデルが 2 つ以上ある場合、これはおそらく良い考えではありません。

しかし、いつでも Backbone.Model を保存できます... では、作成してみませんか?

var Wrapper = Backbone.Model.extend({
   url: 'api/endpoint'
});
var wrapper = new CollectionWrapperModel({
    cart: c.models
}); 
wrapper.save();

または、より簡潔に:

var wrapper = new (Backbone.Model.extend({url: 'api/endpoint'}))({cart: c});
wrapper.save();

サーバーは、複数のモデルの配列である という名前の単一のプロパティを持つ POST または PUT メッセージを受信することに注意してくださいcart。これは、適切に処理する必要があります。

質問者が彼の問題に対して別の解決策を見つけたことは理解していますが、これが誰かの助けになることを願っています.

于 2015-07-03T01:22:00.247 に答える