2017-01-03 18 views
1

Я ищу альтернативные способы вызова метода, определенного в Marionette's behaviors изнутри представления.Могу ли я вызвать методы поведения непосредственно без eventproxy?

Наверняка есть eventproxy но, возможно, это более интуитивным, чтобы вызвать метод непосредственно, как:

view.behaviorsMethod(); 

я мог назначить это нравится:

view.method = behavior.method; 

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

view.method = (view.method !== undefined ? view.method : behavior.method); 

Но это, кажется, не изящный способ.

+0

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

ответ

0

Ответ на ваш вопрос: вы не можете напрямую это сделать, но всегда есть способ. вы можете сделать это с помощью _.invoke(this._behaviors, 'yourMethodName'), но я буду препятствовать его использования поскольку

  1. _behaviors является частной переменной класса Marionette.View и это имя может быть изменено или он может быть удален в будущих версиях

  2. Вам нужно будет установить контекст для метода, поскольку _.invoke не будет устанавливать контекст метода для этого.

Если вы можете установить контекст должным образом, это сработает для вас.

как предложено @ThePaxBisonica в комментарии Я предлагаю вам перейти с шаблоном mixin, из которого вы можете расширить свое поведение и представление, и вам не нужно будет устанавливать какой-либо контекст и не нужно беспокоиться о _behavior приватные переменная

в

var mixin = { 
    behaviorMethodWhichYouWantToCallFromView: function(){ 
      alert("mixin method"); 
    } 
} 

var behavior = mn.behavior.extend(_.extend(mixin, { 
    //actual behavior code remove the method as behavior will get it from mixin 
})) 

var view = mn.view.extend(_.extend(mixin, { 
    //actual view code remove the method as behavior will get it from mixin 
})) 

Надеется, что это помогает. Я знаю, что это очень длинный подход.

+0

Thx для изложения подходов! Я буду обсуждать этот шаг с моими товарищами по команде, и, возможно, мы попробуем попробовать mixin вместо встроенного-события-прокси :) –