Backbone: جمع ونموذج جلب / حفظ حالة الخ

تم إنشاؤها على ٢٤ يناير ٢٠١٣  ·  9تعليقات  ·  مصدر: jashkenas/backbone

لتتمكن من معرفة ما إذا كانت المجموعة مأهولة أم أنها مأهولة ، قد يكون هناك شيء مثل


collection.fetch();
collection.isFetching()===true; // display loading 

(collection.isFetching()===false; && collection.length) // display no records found

حالة استخدام حقيقية (تبسيط ، يتم تمرير الكائنات في عمق النظام):

javascript() // somewhere in the code collection = new MyCollection(); // somewhere else in the code view = new MyView({collection:collection}); // and somewhere else in the code collection.fetch();

يستمع العرض إلى إشارات التجميع ، ويعرض قائمة التحميل / عدم وجود سجلات / سجلات

للنموذج ، يمكن أن يكون هناك شيء حفظ / حذف / تحديث

question

التعليق الأكثر فائدة

braddunbar ، caseywebdev الفكرة هي فصل هذين الجزأين. (يجب أن يكون العرض قادرًا على الحصول على المجموعة في أي حالة ، وليس فقط مجموعة _'clean'_)
أدرك أنه يمكنني القيام بذلك باستخدام الإشارات ، ولكن في كثير من الحالات لا يمكن القيام بذلك بهذه الطريقة. ترتيب الإجراءات مهم

أوافق على أن العرض يجب أن يستمع لإشارات "الطلب" و "المزامنة" ، ولكن قد يتم إرسال إشارة الطلب قبل تمرير المجموعة إلى العرض ، وبالتالي ليس لدى العرض أي فكرة عن أن المجموعة يتم جلبها.

ضع في اعتبارك مثالاً ، حيث تحصل وجهة نظرك على مجموعة عشوائية. يمكن أن تكون هذه المجموعة إما _fetched_ أو _fetching_ أو _unfetched_ عند تمريرها إلى طريقة العرض (tl: dr انظر المثال 3) .

مثال 1 (حيث ستعمل الإشارات)

collection = new Backbone.Collection();
view = new Backbone.View({collection:collection});
view.render();
// what should the view render ?
collection.fetch() // now sync signal gets sent

مثال 2 (يتم جلب العرض بالفعل ، ولكن جمع emty ، ستعمل الإشارات أيضًا)

collection = new Backbone.Collection();
collection.fetch();  // now sync signal gets sent
// after fetch completes
// view won't be able to receive 'sync' signal
view = new Backbone.View({collection:collection}); 
view.render(); 
// at this point collection.length == 0. 
// I guess the view can listen to 'sync' and then render 'empty' 

مثال 3 (الأهم ، لن تعمل الإشارات)

collection = new Backbone.Collection();
collection.fetch();  // now 'request' signal gets sent, but it is pending
// view won't be able to receive 'request' signal
view = new Backbone.View({collection:collection}); // at this point collection.length == 0
// view did not receive the 'request' signal, therefore has no idea that the collection is fetching
// and the view should render  'loading'
// after 2 seconds, 'sync' signal gets sent

يجب ألا تفترض طريقة العرض أنه إذا كانت collection.length == 0 ، فلن يتم إحضارها.
يجب ألا تفترض طريقة العرض أيضًا أنه تم منحها مجموعة في حالة عدم الجلب (أو في أي حالة أخرى).

إذا أردنا فصل المجموعة عن العرض ، فيجب أن تكون طريقة العرض قادرة على معرفة حالة المجموعة.

الشيء نفسه ينطبق على النموذج

ال 9 كومينتر

مرحبا @ g00fy-! أوصي باستخدام الأحداث "request" و "sync" لهذا الغرض. ماذا تعتقد؟

collection.on('request', function() {
  // loading...
}).on('sync', function() {
  // display records or "none found"
});
collection.fetch();

_Edit - قصدت الحدث "request" ، وليس "fetch" ._

أعتقد أن هذه فكرة منتفخةbraddunbar!

شكرا @ caseywebdev! :)

أخبرنا ما إذا كان هذا لا يناسبك @ g00fy-.

braddunbar ، caseywebdev الفكرة هي فصل هذين الجزأين. (يجب أن يكون العرض قادرًا على الحصول على المجموعة في أي حالة ، وليس فقط مجموعة _'clean'_)
أدرك أنه يمكنني القيام بذلك باستخدام الإشارات ، ولكن في كثير من الحالات لا يمكن القيام بذلك بهذه الطريقة. ترتيب الإجراءات مهم

أوافق على أن العرض يجب أن يستمع لإشارات "الطلب" و "المزامنة" ، ولكن قد يتم إرسال إشارة الطلب قبل تمرير المجموعة إلى العرض ، وبالتالي ليس لدى العرض أي فكرة عن أن المجموعة يتم جلبها.

ضع في اعتبارك مثالاً ، حيث تحصل وجهة نظرك على مجموعة عشوائية. يمكن أن تكون هذه المجموعة إما _fetched_ أو _fetching_ أو _unfetched_ عند تمريرها إلى طريقة العرض (tl: dr انظر المثال 3) .

مثال 1 (حيث ستعمل الإشارات)

collection = new Backbone.Collection();
view = new Backbone.View({collection:collection});
view.render();
// what should the view render ?
collection.fetch() // now sync signal gets sent

مثال 2 (يتم جلب العرض بالفعل ، ولكن جمع emty ، ستعمل الإشارات أيضًا)

collection = new Backbone.Collection();
collection.fetch();  // now sync signal gets sent
// after fetch completes
// view won't be able to receive 'sync' signal
view = new Backbone.View({collection:collection}); 
view.render(); 
// at this point collection.length == 0. 
// I guess the view can listen to 'sync' and then render 'empty' 

مثال 3 (الأهم ، لن تعمل الإشارات)

collection = new Backbone.Collection();
collection.fetch();  // now 'request' signal gets sent, but it is pending
// view won't be able to receive 'request' signal
view = new Backbone.View({collection:collection}); // at this point collection.length == 0
// view did not receive the 'request' signal, therefore has no idea that the collection is fetching
// and the view should render  'loading'
// after 2 seconds, 'sync' signal gets sent

يجب ألا تفترض طريقة العرض أنه إذا كانت collection.length == 0 ، فلن يتم إحضارها.
يجب ألا تفترض طريقة العرض أيضًا أنه تم منحها مجموعة في حالة عدم الجلب (أو في أي حالة أخرى).

إذا أردنا فصل المجموعة عن العرض ، فيجب أن تكون طريقة العرض قادرة على معرفة حالة المجموعة.

الشيء نفسه ينطبق على النموذج

@ g00fy إذا لم يكن بإمكانك fetch المجموعة فقط بعد إرسالها إلى العرض ، فقم بتعيين علامة fetching أو ما شابه في مجموعتك.

collection.on({
  request: function () { this.fetching = true; },
  'sync error': function () { this.fetching = false; }
});

الآن يمكن للعرض الوصول إلى this.collection.fetching وانتظر أيضًا this.collection لإطلاق الحدث sync أو error .

تضمين التغريدة
قد يتم إحباط الطلب ، أو قد يتم إرسال طلبين في وقت واحد.

// example 1
collection.fetch().abort()  // and collection.fetching == true
// example 2 - don't care about abort();
collection.fetch();
collection.fetch();
// 1st request compleated
!!collection.fetching == false // but the 2nd request is pending - should it be loading or not?
// 2nd request completed

سيكون الحل لهذا هو توصيل فعل xhr المؤجل

collection.on({
    'request':function(model,xhr){ 
        this.fetching = true; 
        xhr.fail(function(){this.fetching = false }.bind(this));
    },
    'sync error': function () { this.fetching = false; }
});

لهذا السبب ، أعتقد أن هذا قد يكون مفيدًا لتضمينه ، ولكن من ناحية أخرى ، إذا تم تنفيذ كل تحسين مثل هذا ، فستتضخم قاعدة رموز BB.

إذا تم إجراء كل تحسين مثل هذا ، فستتضخم قاعدة رمز BB.

أعتقد أن الأمر لا يتعلق بالانتفاخ بقدر ما يتعلق بالاقتراب. هناك العديد من الطرق المختلفة التي قد ترغب في التعامل معها مع الطلبات المتزامنة. يزودك العمود الفقري بالأوليات التي تحتاجها للتعامل معها ثم تبتعد عن الطريق.

@ g00fy- قد ترغب في إلقاء نظرة على كتابة آلة الحالة المحدودة لأغراضك. يحتوي Chaplin.js على واحد من السهل نسخه ، وهناك أيضًا ifandelse / machina.js (انظر المدونة ) والذي قد يناسب حالة الاستخدام الخاصة بك.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات