2

阅读后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概念?

4

2 回答 2

4

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

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

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

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

使用这两种解决方案,您都可以更改菜单颜色。但是使用命令可以更好地解耦并减少后续工作。当然,这并不意味着您应该在任何地方使用命令:根据您的特定情况调整它们的使用(或不使用)。

于 2013-11-07T20:19:28.527 回答
0

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

重要的是你从中得到了什么。所以,归根结底,这只是品味/专业的问题(尊重模式、惯例等)。

有了commands,您将所有东西都放在一个地方,并且只myApp负责模块/控制器/域/任何“功能最终结果”之间的通信(引用@David Sulc非常好的书:“ Backbone.Marionette.js: A Gentle介绍") 您的应用程序。

长话短说:在大型应用程序中,只传递myApp实例并从那里执行命令是有意义的。

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

那更干净,更有条理。

于 2013-11-12T13:42:55.503 回答