Backbone: يتم مشاركة سمات العرض المخصصة بين حالات مختلفة

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

يرجى الاطلاع على هذا الكمان: http://jsfiddle.net/XgPyH/31/

لذلك نحن بصدد إنشاء 10 حالات من itemView واستدعاء طريقة addItem لإضافة 10 عناصر إلى كل عرض عنصر. يجب أن يحتوي كل itemView على 10 عناصر في خاصية itemArray الخاصة بهم. لكنهم بدلاً من ذلك يشاركون خاصية itemArray ولديهم 100 عنصر فيها.

قد تكون المشكلة أن backbone.view لم يعيد تعيين السمات المخصصة في المنشئ.

question

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

نعم ، نظرًا لأن itemArray هو خاصية للنموذج الأولي itemView ، فإنه يتم مشاركته بواسطة جميع مثيلات itemView . إذا كنت تريد أن يكون للمثيلات itemArray فيجب عليك تعيينها في initialize أو في المُنشئ.

var ItemView = Backbone.View.extend({

  initialize: function() {
    this.itemArray = [];
  },

  ...

});

ال 9 كومينتر

نعم ، نظرًا لأن itemArray هو خاصية للنموذج الأولي itemView ، فإنه يتم مشاركته بواسطة جميع مثيلات itemView . إذا كنت تريد أن يكون للمثيلات itemArray فيجب عليك تعيينها في initialize أو في المُنشئ.

var ItemView = Backbone.View.extend({

  initialize: function() {
    this.itemArray = [];
  },

  ...

});

هذا كمان يقوم بما وصفته: http://jsfiddle.net/XgPyH/32/

مرحبا braddunbar ،

لقد استخدمنا بالفعل نفس الحل الذي نشرته كحل بديل ، ولكن يبدو أننا لا نحتاج إلى القيام بذلك. إنه سلوك محير للغاية ألا تعتقد ذلك؟

هل يمكن أن تشرح فائدة وجود ذلك في النموذج الأولي (لا أفهم تمامًا ، أنا لا أقول أن التطبيق الحالي غير صحيح - فقط أحاول الحصول على بعض التوضيح حتى نتمكن من فهمه).

غالبًا ما نحدد جميع خصائص وجهة نظرنا بالطريقة التي استخدمها spawnedc في

في أمثلة التطبيقات ، يتم تحديد خصائص طرق العرض بنفس الطريقة تمامًا (راجع Todo.js). يتم تحديد متغير "template" بنفس الطريقة ، ولكن بالطبع نظرًا لأنه مجرد سلسلة غير متغيرة ، فإننا لا نرى هذا النوع من المشكلات.

ما هي الطريقة الصحيحة لتحديد خصائص العرض الديناميكي ، بالتأكيد ليست هذه هي الحالة التي يتعين علينا تجاوزها جميعًا في طريقة init ...؟

هل يمكن أن توضح ما فائدة وجود ذلك في النموذج الأولي

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

ما هي الطريقة الصحيحة لتحديد خصائص العرض الديناميكي ، بالتأكيد ليست هذه هي الحالة التي يتعين علينا تجاوزها جميعًا في طريقة init ...؟

نعم ، لتعيين خاصية ذات قيمة قابلة للتغيير في كل مثيل لفئة / مُنشئ ، يجب القيام بذلك في المُنشئ (أو في هذه الحالة initialize ، والذي يتم استدعاؤه من المُنشئ).

كمثال ، هذه هي كيفية إعداد Backbone للخصائص في مثيل Backbone.Model .

braddunbar إذا قمت بإنشاء نسخة _new_ أتوقع _all_ ستتم إعادة تعيين الخصائص لأنها نسخة _ brand new_ . أليس هذا هو السلوك المتوقع أم أني أفتقد شيئًا؟

مرحبا braddunbar ،

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

أليس هذا بالضبط ما يفعله Bacbone مع itemArray في هذه الحالة؟ itemArray موجود في النموذج الأولي وهذا هو سبب حدوث السلوك الذي نواجهه؟

أوافق 100٪ مع spawnedc آخر بيان. لا أتوقع مشاركة أي خصائص بين حالات عرض "الأخوة".

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

var A = function(){};
var a = new A();

var B = function(){};
B.prototype = a;
a.constructor = B;

var b1 = new B();
var b2 = new B();

console.log(b1.foo); // undefined
console.log(b2.foo); // undefined

a.foo = [1];

console.log(b1.foo); // [1]
console.log(b2.foo); // [1]

console.log(b1.foo === b2.foo); // true

إذا كنت مهتمًا ، فهناك شرح رائع هنا .

أليس هذا بالضبط ما يفعله Bacbone مع itemArray في هذه الحالة؟ itemArray موجود في النموذج الأولي وهذا هو سبب حدوث السلوك الذي نواجهه؟

بالضبط. لهذا السبب أوصي بإنشاء itemArray في initialize بدلاً من خاصية النموذج الأولي.

braddunbar شكرًا على الشرح والرابط - لا يزال نوعًا من السلوك الغريب (وغير المتوقع) من ناحية ، ولكن من ناحية أخرى ، من المنطقي تمامًا مشاركة الخصائص بين طرق العرض.

سأقرأ مقال JavaScript Garden وأنا متأكد من أن كل شيء سيصبح واضحًا :).

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