【问题标题】:Is Inline Method Binding A Bad Practice? [closed]内联方法绑定是一种不好的做法吗? [关闭]
【发布时间】:2013-09-19 17:35:13
【问题描述】:

我一直在研究 Angular,它使用 HTML 属性将事件绑定到模型,例如:

<form ng-submit="addTodo()">

这样做不被认为是一种不好的做法吗?我知道使用内联 JavaScript(如 onclick)被认为是一件非常糟糕的事情。

我担心关注点分离。这种方法不反对吗?在 JavaScript 中使用 id 或 class 属性并将事件绑定到基于它们的 DOM 元素不是更干净吗?这似乎不那么混乱了。

我还担心 ng 属性会降低 HTML 的语义。 HTML 应尽可能保持语义化,仅包含表示信息。

我目前正在调查是否将 Angular 用于我正在开发的网络应用程序,这是我的担忧之一。目前,我更倾向于将 vanilla JS 与 RequireJS 之类的东西一起使用。

【问题讨论】:

  • 我认为您误解了 Angular 的基本性质,例如 groups.google.com/forum/#!msg/angular/kqZDVSUlkd0/sge6KsaaKQAJ。它不是客户端上的“JavaScript + HTML”,而是“Angular”,一个恰好通过 HTML 和 Angular 属性指定的客户端 MVC 框架。
  • 看看silverlight ...如果你想要被动视图,我可以理解但忘记了AngularJS,这个框架是以视图为中心的。将 Backbone 与 ModelBinder 一起使用,我认为你会得到你想要的,但 API 更少,而且仍然有很多样板
  • @DaveNewton 谢谢。我有点怀疑。您说它不是 JavaScript + HTML,但它仍然适用于浏览器。浏览器仍将 HTML 解析为 DOM,因此应遵循规范和标准。我将进一步调查这个问题。
  • @ThomasPons 我过去曾使用过一点 SilverLight(好吧,它现在已经死了,就像 Flash 一样)。由于它使用 XAML,因此不能与 HTML 进行很好的比较。我想要没有事件绑定的视图。
  • @RichardKnop 您认为没有遵循什么标准?该标准允许内联 JS,它的约定和实用性使人们远离它。如果您使用的是 Angular,那么将视图与事件和数据分离是没有意义的:这就是 Angular

标签: javascript html angularjs semantic-web separation-of-concerns


【解决方案1】:

内联绑定实践

新的 JavaScript 框架似乎正在重新审视在标记中完成的绑定。长期以来,这被认为是不好的做法,而且在很大程度上仍然是。意见不一。支持者认为,以这种方式绑定在标记中更加明确。您无需使用可能会更改的其他类来创建绑定。

我想说,如果您要使用这样的内联绑定,它们应该非常简单。也就是说,您可能应该只引用绑定中的单个方法,而不是定义内联方法。

ng 属性

我相信 Angular 可以选择让您使用 data-ng-* 来代替它,这将使其有效/语义正确。

【讨论】:

    【解决方案2】:

    好问题!

    实际上,在 dom 中绑定事件或行为是最糟糕的做法。

    ¿但是为什么?

    假设,您知道这是最简单、最快的方法,即在元素上单击并在脚本标签中定义函数,但是在几个元素/函数之后,您将很难维护代码。这就是为什么它是一种不好的做法。

    在 Angular 中,所有代码都是“作用域”,这意味着(几乎)一个 DOM 作用域和一个代码有效/执行的 JS 作用域,因此您可以(主要)轻松地重新利用指令/控制器,而无需绑定大量全局函数.

    关于你暴露的点

    我担心关注点分离。这种方法不反对吗?在 JavaScript 中使用 id 或 class 属性并将事件绑定到基于它们的 DOM 元素不是更干净吗?这似乎不那么混乱了。

    是的,如果您认为这种方式是在将视图与控制器混合在一起,但是在像骨干这样的框架中,您可以在控制器中定义您的 css 选择器用于行为。 模式的混合不一样吗? - 不!角度方式更好,因为可以让您为控制器制作大量模板,将 js 代码减少为仅数据操作。

    我还担心 ng 属性会降低 HTML 的语义。 HTML 应尽可能保持语义化,仅包含表示信息。

    语义为谁,用户或程序员?我的意思是 ui-behavior 是基于 dom 的软件中视图的一部分,因此您可以在不接触控制器的情况下重写模板。当您放置 ng-attributes 时,您正在标记 (htMl) 以供控制器对用户事件做出反应。我认为,通过描述 dom 中的行为,你仍然是语义化的,这对你的代码更好。

    我目前正在调查是否将 Angular 用于我正在开发的网络应用程序,这是我的担忧之一。目前,我更倾向于将 vanilla JS 与 RequireJS 之类的东西一起使用。

    AngularJS 是一种新的组织代码的方式,如果你使用 vanillaJS,你会发现 js 非常实用来维护你的代码,我保证你会保存至少 80% 的 CSS 选择器和行为描述。

    【讨论】:

      猜你喜欢
      • 2023-03-27
      • 2017-05-19
      • 1970-01-01
      • 2017-05-08
      • 2019-05-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-27
      • 1970-01-01
      相关资源
      最近更新 更多