DOM 操作不应该在 AngularJS Controller 中执行是常识,但是很难找到为什么这是一件坏事。所有消息来源都说它很难测试,因为 Controller 应该用于指令之间的通信,但未能用代码说明为什么这是一件坏事。
根据我的理解,我认为 Controller 与指令不同,它不与任何特定的 HTML 相关联,因此 Controller 所做的所有 DOM 修改很可能会失败。这肯定会使开发和测试复杂化。
在子指令的链接函数之前执行的指令中的 Controller 也会失败,因为 Controller 可能不知道子指令的实际 HTML 是什么。链接在 Controller 函数之后执行,可能会修改 HTML 结构。
我希望我在这里说得通,如果有人能澄清为什么从 Controller 操纵 DOM 是一件坏事,也许一些代码示例或链接可以很好地解释它,那就太好了。
最佳答案
用代码示例更难证明他们的观点的原因是,这个原因不能真正用一个简短的代码片段来表示(对于 Stack Overflow 来说足够短)。这确实是一种可维护性预防措施。从长远来看,您希望能够独立地独立更改 Controller 和 View 背后的逻辑,因为否则耦合的 Controller 和 View 对往往会保持这种状态并在不破坏对方的情况下相互限制更改功能的能力。一旦您决定更改有关 View 的任何内容,您就有机会破坏您的 Controller 代码,甚至无需触及它。
随着时间的推移,测试会变得更容易,因为您拥有的测试越多,您就越希望事情更加模块化并且依赖于尽可能少的变量和参数。
同样,是维护插入了这一建议。上面列出的问题一开始可能还不错。但是想象一下,采用一个您不是从头开始构建的项目,并且了解将此应用程序保持在一起的 Controller 和 View 之间的耦合背后的所有复杂性。如果您的应用程序包含数千行代码,即使您从头开始构建它也不可能了解所有这些错综复杂的内容,该怎么办?
要更全面地了解为什么需要像您提到的那样的设计模式,您可以引用此 google search只要您愿意,它就会带您踏上一段旅程。为了大致了解为什么设计模式甚至存在以及为什么许多人最终一遍又一遍地提出同样的建议,您可以引用引入设计模式的催化剂之一,Christopher Alexander .他向我们展示了模式之所以如此,是因为它们运作良好,而且人们会重复行之有效的做法。
关于javascript - AngularJS - 为什么在 Controller 中操作 DOM 是一件坏事?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29981419/
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
我主要使用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
我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>
为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返
刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr
我知道您通常应该在Rails中使用新建/创建和编辑/更新之间的链接,但我有一个情况需要其他东西。无论如何我可以实现同样的连接吗?我有一个模型表单,我希望它发布数据(类似于新View如何发布到创建操作)。这是我的表格prohibitedthisjobfrombeingsaved: 最佳答案 使用:url选项。=form_for@job,:url=>company_path,:html=>{:method=>:post/:put} 关于ruby-on-rails-rails:Howtomak
它不等于主线程的binding,这个toplevel作用域是什么?此作用域与主线程中的binding有何不同?>ruby-e'putsTOPLEVEL_BINDING===binding'false 最佳答案 事实是,TOPLEVEL_BINDING始终引用Binding的预定义全局实例,而Kernel#binding创建的新实例>Binding每次封装当前执行上下文。在顶层,它们都包含相同的绑定(bind),但它们不是同一个对象,您无法使用==或===测试它们的绑定(bind)相等性。putsTOPLEVEL_BINDINGput
我可以得到Infinity和NaNn=9.0/0#=>Infinityn.class#=>Floatm=0/0.0#=>NaNm.class#=>Float但是当我想直接访问Infinity或NaN时:Infinity#=>uninitializedconstantInfinity(NameError)NaN#=>uninitializedconstantNaN(NameError)什么是Infinity和NaN?它们是对象、关键字还是其他东西? 最佳答案 您看到打印为Infinity和NaN的只是Float类的两个特殊实例的字符串