Backbone: لا تمحو المجموعة مرجع "_byId" الداخلي لنموذج تمت إزالته

تم إنشاؤها على ٢٢ سبتمبر ٢٠١٧  ·  3تعليقات  ·  مصدر: jashkenas/backbone

يرجى الاطلاع أدناه على الاستنساخ الأصعب الذي يمكنني فهمه من سلسلة من الخطوات في تطبيق العمود الفقري الذي يؤدي إلى دخول 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()
;
bug

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

نعم - يجب ألا تفعل هذا أبدًا ، لكنه لا يزال يمثل خطأ.

يجب أن نصلح هذا الأمر عن طريق التأكد من أنه إذا تم تغيير id من قيمة إلى null ، فنحن delete this._byId[id] أولاً.

ال 3 كومينتر

حسنًا ، ممتع. عندما نضيف نموذجًا إلى المجموعة ، نضيف __byId_ خاصيتين: model.id و model.cid ، مرجعهما إلى النموذج. إصدار في 1134 سطر ، id === غير محدد ، لكن __byId_ يحتوي على model.id - _'foo'_.

لا تحتوي المجموعة على منطق خاص عند تغيير النموذج. id إلى value == null ، تحقق من السطر 1183.

كما يمكنك تغيير unset لتعيين _null_ أو _undefined_. this.model.set ('id'، null)؛

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

backbone_remove

backbone_model_event

نعم - يجب ألا تفعل هذا أبدًا ، لكنه لا يزال يمثل خطأ.

يجب أن نصلح هذا الأمر عن طريق التأكد من أنه إذا تم تغيير id من قيمة إلى null ، فنحن delete this._byId[id] أولاً.

إذا قمت بإزالة نموذج من مجموعة دون استخدام حدث ، فإنه يعمل كما هو متوقع. تكمن المشكلة في _onModelEvent الذي يتحقق مما إذا كان اسم الحدث هو change ، عندما يكون اسم الحدث الفعلي الذي يتم إرساله في هذه الحالة هو change:id .

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