لتتمكن من معرفة ما إذا كانت المجموعة مأهولة أم أنها مأهولة ، قد يكون هناك شيء مثل
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();
يستمع العرض إلى إشارات التجميع ، ويعرض قائمة التحميل / عدم وجود سجلات / سجلات
للنموذج ، يمكن أن يكون هناك شيء حفظ / حذف / تحديث
مرحبا @ 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) .
collection = new Backbone.Collection();
view = new Backbone.View({collection:collection});
view.render();
// what should the view render ?
collection.fetch() // now sync signal gets sent
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'
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 (انظر المدونة ) والذي قد يناسب حالة الاستخدام الخاصة بك.
التعليق الأكثر فائدة
braddunbar ، caseywebdev الفكرة هي فصل هذين الجزأين. (يجب أن يكون العرض قادرًا على الحصول على المجموعة في أي حالة ، وليس فقط مجموعة _'clean'_)
أدرك أنه يمكنني القيام بذلك باستخدام الإشارات ، ولكن في كثير من الحالات لا يمكن القيام بذلك بهذه الطريقة. ترتيب الإجراءات مهم
أوافق على أن العرض يجب أن يستمع لإشارات "الطلب" و "المزامنة" ، ولكن قد يتم إرسال إشارة الطلب قبل تمرير المجموعة إلى العرض ، وبالتالي ليس لدى العرض أي فكرة عن أن المجموعة يتم جلبها.
ضع في اعتبارك مثالاً ، حيث تحصل وجهة نظرك على مجموعة عشوائية. يمكن أن تكون هذه المجموعة إما _fetched_ أو _fetching_ أو _unfetched_ عند تمريرها إلى طريقة العرض (tl: dr انظر المثال 3) .
مثال 1 (حيث ستعمل الإشارات)
مثال 2 (يتم جلب العرض بالفعل ، ولكن جمع emty ، ستعمل الإشارات أيضًا)
مثال 3 (الأهم ، لن تعمل الإشارات)
يجب ألا تفترض طريقة العرض أنه إذا كانت collection.length == 0 ، فلن يتم إحضارها.
يجب ألا تفترض طريقة العرض أيضًا أنه تم منحها مجموعة في حالة عدم الجلب (أو في أي حالة أخرى).
إذا أردنا فصل المجموعة عن العرض ، فيجب أن تكون طريقة العرض قادرة على معرفة حالة المجموعة.
الشيء نفسه ينطبق على النموذج