2016-05-25 5 views
1

Мне нужно сделать костяк + марионетку webapp с нуля, чего я никогда не делал, и я борюсь с базовой структурой кода.Магистральная магия: ставьте методы на экземпляр/конструктор или прототип при расширении объектов

Я понимаю концепцию JavaScript о методах создания конструктора (воссозданного для каждого экземпляра) или прототипа (разделяемого между экземплярами).

Однако я изо всех сил пытаюсь понять, как это переводится в простейший синтаксис, чтобы выполнять эту работу при расширении базовых моделей и марионеточных представлений.

Это сообщение, кажется, объясняет мою проблему подробно, однако синтаксис, который они приводят для расширения представлений, довольно сложный, и причина, по которой я решил использовать Marionette поверх Backbone, - это абстрагировать такой структурный код и воспользоваться преимуществами их более продвинутые типы вид:

http://blog.scottlogic.com/2012/12/14/view-inheritance-in-backbone.html

марионеток «Параметры», как представляется, способ присоединить свойства к экземпляру или прототипа, но я не уверен в том, как использовать их в качестве примера:

http://marionettejs.com/docs/v2.4.5/marionette.functions.html#marionettemergeoptions

Итак, скажем, я хочу построить CaseView, который простирается от Marionette CompositeView и имеет метод обучения. Я хочу, чтобы метод learnerCompleted включался в прототип CaseView, потому что я не хочу, чтобы метод был создан для каждого из моих 600 экземпляров case view. Однако я не хочу, чтобы метод learnerCompleted использовался в прототипе Marionette CompositeView, потому что у меня есть другой вид типа CategoryView, который также простирается от Marionette CompositeView, но не нуждается в методе learnerCompleted.

Каким будет простейший синтаксис для достижения этого, используя встроенные функции Marionette? Я думаю, что сообщение в блоге scottlogic предлагает решение, но синтаксис сложный, и мне интересно, есть ли более простой способ добиться того же, используя встроенные утилиты Marionette.

Большое спасибо за вашу помощь!

ответ

0

Вы можете сделать это, расширив Marionette's CompositeView и указав функцию learnerCompleted.

var CaseView = Backbone.Marionette.CompositeView.extend({ 
    learnerCompleted: function() { 
    /* ... */ 
    } 
}); 

var CategoryView = Backbone.Marionette.CompositeView.extend({ 
}); 

С выше, функция learnerCompleted ставится на CaseView прототип, НЕ марионеток-х CompositeView. Поэтому функция learnerCompleted не определена для вашего CategoryView.

Я создал простую скрипку, показывая это: https://jsfiddle.net/jdrap2yk/

+0

Спасибо за вашу помощь! Я также нашел эту статью по той же проблеме, для других людей, которые нашли мой вопрос через google: http://www.erichynds.com/blog/backbone-and-inheritance – MelanieMenard