2017-01-03 29 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,而不是build-in-event-proxy :) –

相关问题