Общие возможности Marionette
В Marionette есть несколько методов, общих для всех классов.
Индекс документации
- initialize
- extend
- API событий
- triggerMethod
- bindEvents
- unbindEvents
- bindRequests
- unbindRequests
- normalizeMethods
- getOption
- mergeOptions
- Свойство
options
initialize
Как и классы Backbone, initialize — это метод, который можно определить в любом классе Marionette. Он вызывается при создании экземпляра класса и получает все аргументы, переданные при создании. Первый аргумент может содержать опции, которые класс прикрепляет к экземпляру.
import { MnObject } from 'backbone.marionette';
const MyObject = MnObject.extend({
initialize(options, arg2) {
console.log(options.foo, this.getOption('foo'), arg2);
}
});
const myObject = new MyObject({ foo: 'bar' }, 'baz'); // logs "bar" "bar" "baz"
extend
Заимствованный из Backbone, extend доступен для всех определений классов для наследования на основе классов
API событий
API событий Backbone.Events доступен для всех классов. Каждый класс Marionette может как listenTo любой объект с этим API, так и иметь события, срабатывающие на экземпляре.
Примечание API событий не следует путать с событиями представления events, которые обрабатывают события DOM.
triggerMethod
Вызывает событие и соответствующий метод на объекте. Это то же самое, что и Backbone's trigger, но с дополнительным обработчиком метода.
При срабатывании события, первая буква каждого раздела имени события капитализируется, и перед ним добавляется слово "on". Примеры:
-
triggerMethod('foo')вызывает функцию "onFoo" -
triggerMethod('before:foo')вызывает функцию "onBeforeFoo"
Все аргументы, переданные в вызов triggerMethod, передаются как событию, так и методу, за исключением того, что имя события не передается соответствующему методу.
triggerMethod('foo', bar) вызовет onFoo(bar){...})
import { MnObject } from 'backbone.marionette';
const MyObject = MnObject.extend({
initialize(){
this.triggerMethod('foo', 'baz');
},
onFoo(bar){
console.log(bar);
}
});
const myObj = new MyObject(); // console.log "baz"
myObj.triggerMethod('foo', 'qux'); // console.log "qux"
Дополнительную информацию о triggerMethod можно найти в документации по событиям Marionette.
bindEvents
Этот метод используется для связывания любого объекта, работающего с Backbone.Events API. Это включает все классы Backbone, классы Marionette и каналы Radio.
import Radio from 'backbone.radio';
import { View } from 'backbone.marionette';
const MyView = View.extend({
fooEvents: {
'change:foo': 'doSomething'
},
initialize(){
this.fooChannel = Radio.channel('foo');
this.bindEvents(this.fooChannel, this.fooEvents);
},
doSomething(){
// the "change:foo" event was fired from the radio channel
// respond to it appropriately, here.
}
});
Первый параметр — это entity (Backbone.Model, Backbone.Collection или любой объект, в котором смешан Backbone.Events), от которого связываются события.
Второй параметр — хеш { 'event:name': 'eventHandler' } конфигурации. Вместо имени функции можно указать функцию.
Ошибки Будет выброшено исключение, если второй параметр не является объектом.
unbindEvents
Этот метод используется для отвязки любого объекта, работающего с Backbone.Events API. Это включает все классы Backbone, классы Marionette и каналы Radio.
Вызов этого метода без хеша событий отвяжет все события от канала.
import Radio from 'backbone.radio';
import { View } from 'backbone.marionette';
const MyView = View.extend({
fooEvents: {
'change:foo': 'onChangeFoo',
'stop': 'onStop'
},
initialize(){
this.fooChannel = Radio.channel('foo');
this.bindEvents(this.fooChannel, this.fooEvents);
},
onChangeFoo(){
// the "change:foo" event was fired from the radio channel
// respond to it appropriately, here.
// Doing something
this.listenTo(this.fooChannel, 'adhoc', this.render);
},
onStop() {
// Removes all fooEvents
this.unbindEvents(this.fooChannel, this.fooEvents);
// Removes all bound fooChannel events including `adhoc`
this.unbindEvents(this.fooChannel);
}
});
Первый параметр — entity (Backbone.Model, Backbone.Collection или любой объект, в котором смешан Backbone.Events), от которого отвязываются события.
Второй параметр — хеш { 'event:name': 'eventHandler' } конфигурации. Вместо имени функции можно указать функцию. Если второй параметр не указан, удаляются все обработчики.
bindRequests
Этот метод используется для связывания любого объекта, работающего с Backbone.Radio API запросов. Это включает каналы Radio.
import Radio from 'backbone.radio';
import { View } from 'backbone.marionette';
const MyView = View.extend({
channelName: 'myChannelName',
radioRequests: {
'foo:bar': 'doFooBar'
},
initialize() {
const channel = Radio.channel(this.channelName);
this.bindRequests(channel, this.radioRequests);
},
doFooBar() {
console.log('foo:bar');
return 'bar';
}
});
const myView = new MyView();
const channel = Radio.channel('myChannelName');
channel.request('foo:bar'); // Logs 'foo:bar' and returns 'bar'
Первый параметр, channel, — экземпляр из Radio.
Второй параметр — хеш { 'request:name': 'replyHandler' } конфигурации. Вместо имени функции можно указать функцию.
Ошибки Будет выброшено исключение, если второй параметр не является объектом.
unbindRequests
Этот метод используется для отвязки любого объекта, работающего с Backbone.Radio API запросов.
Вызов этого метода без хеша радио запросов отвяжет все запросы от канала.
ПРИМЕЧАНИЕ: Для предотвращения утечек памяти, unbindRequests следует вызывать в или до onBeforeDestroy.
import Radio from 'backbone.radio';
import { View } from 'backbone.marionette';
const MyView = View.extend({
channelName: 'myChannelName',
radioRequests: {
'foo:bar': 'doFooBar'
},
onAttach() {
const channel = Radio.channel(this.channelName);
this.bindRequests(channel, this.radioRequests);
},
onBeforeDetach() {
const channel = Radio.channel(this.channelName);
this.unbindRequests(channel, this.radioRequests);
}
});
Первый параметр, channel, — экземпляр из Radio.
Второй параметр — хеш { 'request:name': 'replyHandler' } конфигурации. Вместо имени функции можно указать функцию. Если второй параметр не указан, все обработчики удаляются.
normalizeMethods
Принимает хеш имён событий и функций (или имён функций) и возвращает тот же хеш, но с именами функций, заменёнными на сами функции.
import { View } from 'backbone.marionette';
const MyView = View.extend({
initialize() {
const hash = {
'action:one': 'handleActionOne', // This will become a reference to `this.handleActionOne`
'action:two': this.handleActionTwo
};
this.normalizedHash = this.normalizeMethods(hash);
},
do(action) {
this.normalizedHash[action]();
},
handleActionOne() {
console.log('action:one was fired');
},
handleActionTwo() {
console.log('action:two was fired');
}
});
const myView = new MyView();
myView.do('action:one');
myView.do('action:two');
getOption
Для доступа к опции используется метод getOption. getOption обращается к значению с тем же именем, определённым в экземпляре, если оно не определено в опциях.
import { View } from 'backbone.marionette';
const View = View.extend({
classVal: 'class value',
initialize(){
this.instanceVal = 'instance value'
}
});
const view = new View({ optVal: 'option value' });
view.getOption('instanceVal'); // instance value
view.getOption('classVal'); // class value
view.getOption('optVal'); // option value
const view2 = new View({ instanceVal: 'foo', classVal: 'bar', optVal: 'baz' });
view.getOption('instanceVal'); // foo
view.getOption('classVal'); // bar
view.getOption('optVal'); // baz
Ложные значения
Функция getOption возвращает любое ложное значение из options, кроме undefined. Если у объекта опции есть неопределённое значение, он попытается прочитать значение непосредственно из объекта.
Например:
import { MnObject } from 'backbone.marionette';
const MyObject = MnObject.extend({
foo: 'bar',
initialize() {
console.log(this.getOption('foo'));
}
});
const model1 = new MyObject(); // => "bar"
const myObj = {};
console.log(myObj.foo); // undefined
const model2 = new MyObject({ foo: myObj.foo }); // => "bar"
В этом примере возвращается "bar" в обоих случаях, так как во втором примере значение f неопределено.
mergeOptions
Метод mergeOptions принимает два аргумента: объект options и объект keys для извлечения значений из объекта опций. Любые соответствующие keys объединяются с экземпляром класса. Например:
import { MnObject } from 'backbone.marionette';
const MyObject = MnObject.extend({
initialize(options) {
this.mergeOptions(options, ['model', 'something']);
// this.model and this.something will now be available
}
});
const myObject = new MyObject({
model: new Backbone.Model(),
something: 'test',
another: 'value'
});
console.log(myObject.model);
console.log(myObject.something);
console.log(myObject.getOption('another'));
В этом примере model и something напрямую доступны в экземпляре MyObject, тогда как another доступен через getOption. Это удобно, когда вы хотите добавить дополнительные ключи, которые будут часто использоваться в определённом классе.
Свойство options
Классы Marionette принимают свойство options в определении класса, которое объединяется с аргументом options, переданным при создании экземпляра. Значения из переданного аргумента options переопределяют значения свойства.
Аргумент
optionsпередаваемый в методinitializeравен переданному при создании класса. Для получения опции внутри initialize, учитывая свойствоoptions, необходимо использоватьgetOption
import { MnObject } from 'backbone.marionette';
const MyObject = MnObject.extend({
options: {
foo: 'bar',
another: 'thing'
},
initialize(options) {
console.log(options.foo) // undefined
console.log(this.getOption('foo')) // 'bar'
console.log(this.getOption('another')) // 'value'
}
});
const myObject = new MyObject({
another: 'value'
});
Классы Marionette
Marionette предоставляет несколько классов для построения вашей структуры представления и приложения.
© 2017 Muted Solutions, LLC
Licensed under the MIT License.
https://marionettejs.com/docs/v4.0.0/common.html