سؤال

أقول أن لدي مجموعة ولقد أجريت تغييرات على العديد من نماذجها.ما هي أفضل طريقة لحفظ كافة التغييرات باستخدام طلب هتب واحد?

هل كانت مفيدة؟

المحلول

عادة ما تستريح مقبض إنشاء مثيل واحد / التحديث.ستحتاج إلى تغيير ذلك لقبول مجموعة من الكائنات.

قال، على جانب العميل، ستحتاج إلى الذهاب مباشرة إلى وظيفة BackBone.Sync giveacodicetagpre.

في هذه الحالة يجب أن يكون نموذجك مجموعة من النموذج.يجب أن تكون الطريقة "إنشاء" أو "حفظ" والخيارات تأخذ نفس النوع من الخيارات كإجراء مكالمة jQuery ajax (خطأ، النجاح، إلخ.)

نصائح أخرى

انا ذاهب الى فعل الشيء الخطأ هنا واقتبس ويكيبيديا بشأن الممارسات المريحة المناسبة:a ضع إلى example.com/resources يجب استبدال المجموعة بأكملها بمجموعة أخرى.بناء على ذلك ، عندما اضطررنا إلى دعم تحرير عناصر متعددة في وقت واحد ، كتبنا هذا العقد.

  1. يرسل العميل {"resources": [{resource1},{resource2}]}
  2. يستبدل الخادم المجموعة بأكملها بالمعلومات الجديدة من العميل ، ويعيد المعلومات بعد استمرارها: {"resources": [{"id":1,...},{"id":2,...}]}

كتبنا نصف الخادم من العقد في القضبان ، ولكن هنا نصف العميل (في كوفيسكريبت ، آسف!):

class ChildElementCollection extends Backbone.Collection
  initialize: ->
    @bind 'add', (model) -> model.set('parent_id', @parent.id)

  url: -> "#{@parent.url()}/resources" # let's say that @parent.url() == '/parent/1'
  save: ->
    response = Backbone.sync('update', @, url: @url(), contentType: 'application/json', data: JSON.stringify(children: @toJSON()))
    response.done (models) => @reset models.resources

اعتقدت أن هذا كان الكثير أسهل في التنفيذ ثم تجاوز العمود الفقري.مزامنة.أحد التعليقات على الكود ، كانت مجموعاتنا دائما كائنات فرعية ، والتي يجب أن تشرح سبب تعيين الكود "معرف الوالدين" عند إضافة كائن إلى المجموعة ، وكيف أن جذر عنوان ورل هو عنوان ورل للوالد.إذا كانت لديك مجموعات على مستوى الجذر تريد تعديلها ، فما عليك سوى إزالة @parent الأعمال.

يجب عليك تمديد Backbone.Collection, ، يعطيها save() الطريقة التي من شأنها أن تحقق كل من نماذجها hasChanged().

ثم يجب أن ندعو Backbone.sync, ، والتي من المحتمل أن تضطر إلى تمديدها قليلا إلى وظيفة مزامنة مخصصة.إذا كنت تستخدم مخصص Backbone.sync وظيفة ، ثم تأكد من تعيينها على مجموعتك.

var CollectionSync = function(method, model, [options]) {
    // do similar things to Backbone.sync
}

var MyCollection = Backbone.Collection.extend({
    sync: CollectionSync,
    model: MyModel,
    getChanged: function() {
        // return a list of models that have changed by checking hasChanged()
    },
    save: function(attributes, options) {
        // do similar things as Model.save
    }
});

نهج مختلف (باستخدام نموذج لتمثيل المجموعة) هنا: "كيف" لحفظ مجموعة كاملة في العمود الفقري.شبيبة-العمود الفقري.مزامنة أو مسج.اياكس?

أنا أيضا أحب https://stackoverflow.com/a/7986982/137067

يضيف هذا الرمز طريقة جديدة إلى نموذج المجموعة النموذجي لمجرد استدعاء طريقة حفظ هذه النماذج التي تغيرت.عملت بالنسبة لي: giveacodicetagpre.

gist link: https:/gist.github.com/julianitor/701c677279bac1529b88

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top