Backbone.js Наследовать представления - PullRequest
3 голосов
/ 07 октября 2011

У меня есть FormView, который обрабатывает такие события, как сохранение и отмена.У меня также есть AjaxFormView, который обрабатывает сохранение, отмену и получение формы с помощью ajax.У меня есть AssetFormView, который обрабатывает сохранить, отменить, получить по Ajax, удалить и распечатать.Так далее и тому подобное.есть значительное повторение.

Я нашел сообщение в этом сообщении http://kalimotxocoding.blogspot.com/2011/03/playing-with-backbonejs-views.html

, где он показывает, что вы можете расширять представления.Тем не менее, я обнаружил, что когда у меня есть несколько версий представлений на странице, свойства перекрестного опыления.Разве нет встроенного способа наследования представлений в магистрали, это безопасно?

Спасибо,

Raif

* ммм, ну, этот материалдовольно густо, и моя текущая проблема перекрестного опыления может быть (возможно, есть) результатом некоторой ошибки с моей стороны, но вопрос все еще остается, есть ли и не будет ли важной особенностью иметь какой-то способ наследования представлений?

Ответы [ 2 ]

2 голосов
/ 11 октября 2011

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

Механизм View.extend работает довольно хорошо. Имейте в виду, однако, что вы расширяете один прототип новыми функциями. С прототипным наследованием прототип делит свои объекты с новыми экземплярами.

Я предполагаю, что когда вы говорите, что ваши свойства "перекрестно опыляют", вы на самом деле делаете что-то вроде этого:

var baseModel = Backbone.Model.extend({
    defaults: {
        foo: { bar: "baz" }
    }
});

Поскольку объекты являются общими, каждый экземпляр baseModel заканчивается тем же объектом для foo, что создает ощущение перекрестного опыления.

Если вместо этого вы определяете свои значения по умолчанию как функцию, то каждый экземпляр получает свою собственную копию объекта foo, и ваше перекрестное опыление исчезает.

var baseModel = Backbone.Model.extend({
    defaults: function() { return {
        foo: { bar: "baz" }
    } }
});

Конечно, без кода мы не можем быть уверены, в чем ваша проблема. Просто знайте, что этот механизм хорошо используется в сообществе без проблем. Это безопасно. Вам просто нужно понять, что происходит.

0 голосов
/ 26 июня 2012

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

Если бы я сделал это так, я бы переопределил то, что определил родитель:

App.parent = Backbone.View.extend({
    events: {
        'click #button-add': 'onAddButtonClicked'
        'click #button-delete': 'onDeleteButtonClicked'
    }

    onAddButtonClicked: function() {
        console.log('onAddButtonClicked');
    },

    onDeleteButtonClicked: function() {
        console.log('onDeleteButtonClicked');
    }
});

App.child = App.parent.extend({
    initialize: function() {
        // This looks redundant but it seems to protect App.parent::events
        this.events = _.extend({}, this.additionalEvents, this.events);

        // THIS IS WRONG and results in errors when I have multiple childdren:
        _.extend(this.events, this.additionalEvents); // <-- this seems to change the parent
    }

    additionalEvents: {
        'click #button-additional': 'onOtherButtonClicked'
    },

    onOtherButtonClicked: function() {
        console.log('child:onOtherButtonClicked');
    }
});

При расширении родительских событий, таких как:

_.extend(this.events, this.additionalEvents);

Я бы получил «Неопознанная ошибка: метод onOtherButtonClicked не существует» , потому что я изменял поле событий App.parent. App.child2 взрывался, потому что не мог видеть события, которые были помещены туда App.child.

Изменив его на:

this.events = _.extend({}, this.additionalEvents, this.events);

Мне удалось защитить родителя.

...