普通函数和Marionette.Commands之间有什么区别

时间:2013-11-07 07:08:22

标签: javascript function marionette

阅读Marionette.Commands后,我很好奇地发现正常函数和Marionette.Commands之间存在差异。

如果您定义任何功能,您可以在任何地方调用该功能。

正常功能:

var normalFun=function(){alert("Normal Function")};

同样的方式Marionette.commands也像以下方式一样工作。

//creating instance for Application class
var myApp=new Marionette.Application();
//registering command
myApp.Commands.setHandler("functionName",function(){alert("This is just a normal function but way of defining as different in my point of view.")});
//whereever you want to call this command just run that command with corresponding name
myApp.Commands.execute("functionName");

我在想,正常功能和Marionette.Commands都是一样的。如果它是正确的那么Marionette开发人员为什么要开发这个Marionette.Commands概念?

2 个答案:

答案 0 :(得分:4)

要使用函数,您需要从同一范围调用它,或者引用包含对象。这不是命令的情况,因此它们允许解耦。

假设您想要在用户点击应用中的某个按钮时更改菜单的颜色。您可以在(例如)管理标头的应用程序部分中定义changeColor函数。然后,您可以通过从应用程序中的某个位置调用(例如)myHeader.changeColor()来更改菜单颜色。但如上所述,这意味着您需要引用myHeader才能调用其changeColor方法。

在开发应用程序时,您会发现实际上菜单本身变得非常复杂,并且直接更改自己的颜色(而不是让标题管理颜色)更有意义。现在,您需要进入应用程序并将myHeader.changeColor()的每个实例更改为myMenu.changeColor()。这是由于您的应用程序的各个位的耦合。

如果您使用命令,则可以从需要更改菜单颜色的位置执行命令,并在"标题"中定义处理程序。部分。然后,当您决定更改应用程序设计时,您可以简单地移动处理程序,以便在"菜单"中定义它。部分。使用此解决方案,您不必更改实际调用以更改菜单颜色,因为它们完全分离。

使用这两种解决方案,您可以更改菜单颜色。但是使用命令可以实现更好的解耦,减少工作量。当然,这并不意味着你应该在任何地方使用命令:根据你的具体情况调整它们的使用。

答案 1 :(得分:0)

他们是一样的。我的意思是一切都在路上(一个功能),总是如此。哈哈。

重要的是你从中做出了什么。所以,最后,这只是品味/专业性的问题(尊重模式,惯例等)。

使用commands,您可以将所有内容放在一个位置,只有myApp负责模块/控制器/域之间的通信/无论"功能最终结果&# 34; (引用@David Sulc非常好的书:" Backbone.Marionette.js: A Gentle Introduction")您的申请。

这么长的故事简短:在一个大型应用程序中,仅传递myApp实例并从那里执行命令是有意义的。

注意:当您使用RequireJS时更有意义。

那个更干净,更有条理。