Backbone: تكرار الأحداث عند إنشاء العرض مرتين

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

عندما أقوم بتعريف طريقة عرض (عبر Backbone.View.extend) وقم بتجسيدها مرتين (عبر جديد) ، عندما يحدث حدث مرة واحدة على كل كائن Ivies ، يتم تشغيله مرتين.

مثال قصير:

<html>
<head>
    <script type="text/javascript" src="js/jquery-1.7.1.js"></script>
    <script type="text/javascript" src="js/underscore-1.3.1.js"></script>
    <script type="text/javascript" src="js/backbone-0.9.1.js"></script>
</head>
<body>
    <div id="test"></div>
    <script type="text/javascript">
        testview = Backbone.View.extend ({
            el: '#test',
             events: {'click .test': 'doTest'},
             doTest: function() {alert('test')},
             render: function() {$('#test').append($('<a>').attr('href', '#').addClass('test').append('test'));}});
        view_one = new testview;
        view_two = new testview;
        view_one.render();
    </script>
    </body>
</html>

ال 9 كومينتر

بدافع الفضول ، لماذا تقوم بتجسيده مرتين؟ هل أنت في عرض محمول أو في شيء يتم فيه استبدال المثيل الأول في منفذ العرض بعرض آخر ، وعندما يعود المستخدم إلى هذا العرض الأول ، فإنك تحصل على روابط مزدوجة؟

شئ مثل هذا. لدي طريقة عرض منزلية ، والتي ستستدعي نقاط نهاية مختلفة إذا قام المستخدم بتسجيل الدخول أم لا. روابط الحدث مخصصة لأزرار تسجيل الدخول / تسجيل الخروج. يتم إنشاء كلا طريقتي العرض ولكن يتم تقديم واحدة فقط في ذلك الوقت. عند تسجيل الدخول أو الخروج ، سأنتقل إلى نفس طريقة العرض ولكن في وضع مختلف. أتمنى أن يكون هذا واضحًا بدرجة كافية.

لا يزال الأمر غير واضح تمامًا بالنسبة لي ، لماذا يتم إنشاء كلا الرأيين في نفس الوقت. إن ربط كلاهما بنفس العنصر الموجود مسبقًا في dom يعني أنه ستكون هناك أحداث مزدوجة. هذا ليس خطأ حقًا ، ولكن فقط الطريقة التي تعمل بها الأحداث وتفويض الأحداث على وجه التحديد.

إذا قمت بإنشاء مثيل لعنصر موجود مسبقًا ، فستحتاج إلى إلغاء ربط هذه الأحداث على وجه التحديد أو ستستمر حتى تتم إزالة عقدة العنصر نفسها من dom.

حسنًا ، يبدو أنها فكرة جيدة إنشاء مثيل لكلا العرضين أثناء التهيئة ، وربطهما بنفس عنصر الجذر في DOM ، ثم عرض أحدهما أو الآخر وفقًا لوضع تسجيل الدخول وجعله يستبدل عناصر الآخر أثناء العرض. أعتقد أن هناك طريقة أفضل للقيام بذلك ، من تعليقاتك.

أود إنشاء مثيل وجهات النظر عندما تحتاج إليها. إذا لم يتم استخدام أحد العروض ، فلا داعي لامتلاكه حول شغل الذاكرة وإحداث آثار جانبية محتملة كما تراه.

لا أميل إلى استخدام هذا النمط:

var View = Backbone.View.extend ({
    el: '#test',
    events: 
    {
        'click .test': 'onClick'
    },
    onClick: function(event) 
    { 
        ... 
    }
});

view = new View;
view.render();

لكني بدلاً من ذلك أميل إلى استخدام هذا النمط ، تمامًا لتجنب مشاهدات الزومبي التي تؤدي إلى تكرار الأحداث

var View = Backbone.View.extend ({
    events: 
    {
        'click .test': 'onClick'
    },
    onClick: function(event) 
    { 
        ... 
    }
});

view = new View;
$('#target').append(view.render().el);

الموقع الوحيد الذي سأستخدم فيه النمط الأول الخاص بك ، هو في عرض Chrome للتطبيق الذي يقوم بإنشاء مثيل واجهة المستخدم الرسومية:

var Application = Backbone.View.extend({
    el: '#wrapper',
    initialize: function (options)
    {
        this.render();
    }
)};

$(document).ready(function () {
    window.application = new Application();
});

مثلما قال el والسماح للعرض بإنشاء عنصر خاص به. أفعل ذلك 95٪ من الوقت أيضًا. ومع ذلك ، إذا كنت تريد تحديد el وتنظيف الأحداث عند الإزالة ، فيمكنك تحديد طريقة Backbone.View.destroy() باستخدام .off() مقابل كل on() وكل حدث في events: {}

فمثلا:

var MyView = Backbone.View.extend({

  initialize: function() {
    this.model.on('change', this.render, this);
  },

  render: function() {
    return this;
  },

  destroy: function() {
    this.remove();
    this.model.off('change', this.render, this);
  }
})

شكرًا ، malandrew و vincentbriglia ، هذا يساعد حقًا.

فقط لتحديث هذا للأجيال القادمة ... أضفت طريقة إتلاف إلى فئة العرض التي تبدو مثل هذا

           destroy: function() {
                this.undelegateEvents();
            }

ثم أقوم فقط بتدمير العرض الحالي (State.view) عندما أقوم بإنشاء مثيل ().

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