到目前为止,我主要使用 Struts 2、Spring、JQuery 技术栈来构建 Web 应用程序。重点是,提到的堆栈使用服务器端 MVC 模式。 Web 浏览器的主要作用仅限于请求/响应周期(+ 客户端验证)。数据检索、业务逻辑、连接和验证是服务器端的主要职责。
我有几个关于 AngularJS 框架的问题,这些问题的灵感来自于我读过的以下引述:
For Angular apps, we encourage the use of the Model-View-Controller (MVC) design pattern to decouple the code and to separate concerns.
来自 Wikipedia Model–view–controller :
Model–View–Controller (MVC) is an architecture that separates the representation of information from the user's interaction with it. The model consists of application data and business rules, and the controller mediates input, converting it to commands for the model or view
AngularJS 使用客户端 MVC 模式。所以我想没有其他选择可以以某种方式将验证逻辑也包含到客户端吗?
编写健壮的 AngularJS 应用程序的最佳方法是什么?客户端的 MVC 和服务器端的某种 MC(模型、 Controller )?
这是否意味着 MODEL 和 CONTROLLER 以一种方式重复(客户端/服务器)?
我知道我的问题有点奇怪,但我认为原因是,我以某种方式习惯了传统的服务器端 MVC 模式。我确定有人已经完成了相同的转换。
最佳答案
这根本不是一个奇怪的问题——我一直在尝试向许多 Java 开发人员推销 Angular,他们会问这个问题。学习的时候自己问的(我还在学习,btw)
如果您采用您所描述的“传统”java webapp 并对其进行 Angular 化处理,则必须首先采用您的服务器并将其设为 RESTful API。删除 JSP 等。这实际上是编写 Angular 应用程序的困难部分,IMO - 正确使用 REST API。对我来说,决定将什么逻辑需要进入服务器的关键是将其视为一个纯 api 并暂时忘记它会有一个前端。
这个问题对我很有帮助——如果有人试图保存给定资源,而该资源没有有效数据,则没有前端可以告诉他们——他们直接访问了 API,因此 API 需要拒绝它。因此,后端负责深度验证。这也适用于您的业务逻辑。假设某人只是使用 API,那么您的服务器需要做什么将变得很清楚。
服务器还需要以(可能)json 格式提供数据(我使用 Spring MVC + Jackson),因此它负责将模型暴露给 Angular,并与数据库通信。
那么 Angular 方面的 MVC 是什么?
但为什么客户端和服务器中的逻辑重复呢?主要是因为您不是在编写一个应用程序,而是在编写两个独立的东西:
所以,简短的回答 - 通过忘记会有一个 UI 来获得正确的 REST API,并且进入 Angular 的内容会更加清晰。
关于javascript - AngularJS 客户端 MVC 模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13067607/
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende
给定一个复杂的对象层次结构,幸运的是它不包含循环引用,我如何实现支持各种格式的序列化?我不是来讨论实际实现的。相反,我正在寻找可能会派上用场的设计模式提示。更准确地说:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构。此外,应该可以将该层次结构序列化为JSON、XML和可能的HTML。我可以为此使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据-无论是在内存中还是文本中-我想用它来构建其他东西。我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松支持多种XML格式。 最佳答案 我最
了解Rails缓存如何工作的人可以真正帮助我。这是嵌套在Rails::Initializer.runblock中的代码:config.after_initializedoSomeClass.const_set'SOME_CONST','SOME_VAL'end现在,如果我运行script/server并发出请求,一切都很好。然而,在我的Rails应用程序的第二个请求中,一切都因单元化常量错误而变得糟糕。在生产模式下,我可以成功发出第二个请求,这意味着常量仍然存在。我已通过将以上内容更改为以下内容来解决问题:config.after_initializedorequire'some_cl
我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的
我经常迷上ruby的一件事是递归模式。例如,假设我有一个数组,它可能包含无限深度的数组作为元素。所以,例如:my_array=[1,[2,3,[4,5,[6,7]]]]我想创建一个方法,可以将数组展平为[1,2,3,4,5,6,7]。我知道.flatten可以完成这项工作,但这个问题是作为我经常遇到的递归问题的一个例子-因此我试图找到一个更可重用的解决方案。简而言之-我猜这种事情有一个标准模式,但我想不出任何特别优雅的东西。任何想法表示赞赏 最佳答案 递归是一种方法,它不依赖于语言。您在编写算法时要考虑两种情况:再次调用函数的情
这应该是一个简单的问题,但我找不到任何相关信息。给定一个Ruby中的正则表达式,对于每个匹配项,我需要检索匹配的模式$1、$2,但我还需要匹配位置。我知道=~运算符为我提供了第一个匹配项的位置,而string.scan(/regex/)为我提供了所有匹配模式。如果可能,我需要在同一步骤中获得两个结果。 最佳答案 MatchDatastring.scan(regex)do$1#Patternatfirstposition$2#Patternatsecondposition$~.offset(1)#Startingandendingpo
我想开始使用“Sinatra”框架进行编码,但我找不到该框架的“MVC”模式。是“MVC-Sinatra”模式或框架吗? 最佳答案 您可能想查看Padrino这是一个围绕Sinatra构建的框架,可为您的项目提供更“类似Rails”的感觉,但没有那么多隐藏的魔法。这是使用Sinatra可以做什么的一个很好的例子。虽然如果您需要开始使用这很好,但我个人建议您将它用作学习工具,以对您来说最有意义的方式使用Sinatra构建您自己的应用程序。写一些测试/期望,写一些代码,通过测试-重复:)至于ORM,你还应该结帐Sequel其中(imho
我想在Ruby的TCPServer中获取客户端的IP地址。以及(如果可能的话)MAC地址。例如,Ruby中的时间服务器,请参阅评论。tcpserver=TCPServer.new("",80)iftcpserverputs"Listening"loopdosocket=tcpserver.acceptifsocketThread.newdoputs"Connectedfrom"+#HERE!HowcanigettheIPAddressfromtheclient?socket.write(Time.now.to_s)socket.closeendendendend非常感谢!