يرجى الاطلاع أدناه على الاستنساخ الأصعب الذي يمكنني فهمه من سلسلة من الخطوات في تطبيق العمود الفقري الذي يؤدي إلى دخول Collection
في حالة من الارتباك الداخلي.
يمكن العثور على نسخة عمل في JSFiddle .
ما يوضحه هو collection
يحتفظ بمرجع داخلي ( _byId
) إلى remove()
-ed Model
. لم يعد هذا Model
جزءًا من collection.models
، ومع ذلك ، لا يزال من الممكن استرداده من خلال id
(السابق).
var
MyView = Backbone.View.extend( {
initialize: function () {
this.model = new Backbone.Model( {
id: 'foo'
, foo: 'bar'
} );
this.collection = new Backbone.Collection( this.model );
this.listenTo( this.model, 'change:id', function ( model, id ) {
if ( id == null ) {
this.collection.remove( model );
}
} );
this.model.unset( 'id' );
$('#models' ).val( JSON.stringify( this.collection.models ));
$('#_byId' ).val( JSON.stringify( this.collection._byId ));
$('#get-foo').val( JSON.stringify( this.collection.get( 'foo' )));
}
})
, foo = new MyView()
;
حسنًا ، ممتع. عندما نضيف نموذجًا إلى المجموعة ، نضيف __byId_ خاصيتين: model.id و model.cid ، مرجعهما إلى النموذج. إصدار في 1134 سطر ، id === غير محدد ، لكن __byId_ يحتوي على model.id - _'foo'_.
لا تحتوي المجموعة على منطق خاص عند تغيير النموذج. id إلى value == null ، تحقق من السطر 1183.
كما يمكنك تغيير unset لتعيين _null_ أو _undefined_. this.model.set ('id'، null)؛
ملاحظة: أعتقد أنك لا تحتاج أبدًا إلى ضبط معرف النموذج الخاص بك على فارغ أو غير محدد ، فهو نمط مضاد.
نعم - يجب ألا تفعل هذا أبدًا ، لكنه لا يزال يمثل خطأ.
يجب أن نصلح هذا الأمر عن طريق التأكد من أنه إذا تم تغيير id
من قيمة إلى null
، فنحن delete this._byId[id]
أولاً.
إذا قمت بإزالة نموذج من مجموعة دون استخدام حدث ، فإنه يعمل كما هو متوقع. تكمن المشكلة في _onModelEvent
الذي يتحقق مما إذا كان اسم الحدث هو change
، عندما يكون اسم الحدث الفعلي الذي يتم إرساله في هذه الحالة هو change:id
.
التعليق الأكثر فائدة
نعم - يجب ألا تفعل هذا أبدًا ، لكنه لا يزال يمثل خطأ.
يجب أن نصلح هذا الأمر عن طريق التأكد من أنه إذا تم تغيير
id
من قيمة إلىnull
، فنحنdelete this._byId[id]
أولاً.