15

也许这不是一个问这个问题的好地方,但我会尽量让它尽可能客观和可回答。

我一直在使用 Angular.js 并且非常喜欢它,但我对它的理念有疑问。这是来自 Angular 站点的控制器代码片段。

   <div ng-controller="TodoCtrl">
      <span>{{remaining()}} of {{todos.length}} remaining</span>
      [ <a href="" ng-click="archive()">archive</a> ]
      <ul class="unstyled">
        <li ng-repeat="todo in todos">
          <input type="checkbox" ng-model="todo.done">
          <span class="done-{{todo.done}}">{{todo.text}}</span>
        </li>
      </ul>
      <form ng-submit="addTodo()">
        <input type="text" ng-model="todoText"  size="30"
               placeholder="add new todo here">
        <input class="btn-primary" type="submit" value="add">
      </form>
    </div>

这基本上是HTML使用 Angular 指令。我发现可能怀疑的一个是:<a href="" ng-click="archive()">archive</a>.

当 Jeffrey Zeldman 编写使用 Web 标准进行设计时,将标记 (HTML)、表示 (CSS) 和交互 (JS) 分离到不同的文件中以实现可维护性已成为最佳实践。

我的问题是,Angular 如何不违反这一点?我真的很喜欢它,并且发现它非常强大,但是将点击事件绑定到a标记中的类似元素与编写这种 pre-web-standards 代码的痕迹之间有什么区别:

<a href='#' onClick='showAlert()'>Click here</a>

<script>
    var showAlert = function(){
      alert('hey');
    }
</script>

除了个人使用框架的经验外,有用的答案可能还参考文档。

4

4 回答 4

9

我将从您认为可疑的一段代码开始,以及在 AngularJS 与纯 HTML 和 Javascript 中处理它的方式之间的根本区别。

这基本上是带有 Angular 指令的 HTML。我发现可能怀疑的一个是:<a href="" ng-click="archive()">archive</a>.

这看起来与我们 10 年前写的非常相似:

<a href="" onclick="archive()">archive</a>

但是,上述 HTML 和 AngularJS 实现之间存在根本区别。对于 AngularJS,该archive函数位于我们控制的范围内,并且可以通过使用控制器进行操作。原始 JS 示例要求它archive位于全局命名空间中(由于许多原因,这很糟糕)。

但是,我们仍然可以看到onclick事件绑定的目的;这意味着能够以声明方式将行为构建到视图中,并让 JS 处理实现细节。AngularJS 做到了这一点,提供了一种方法来组织我们视图的不同范围/上下文,这是常规 HTML 无法实现的。

是的,AngularJS 涉及通过将更多的表示和绑定关注点移动到视图中来扩展 HTML。好消息是我们正朝着 HTML6 的方向前进。以下是来自http://html6spec.com/的一些精选报价:

想象一下能够以您想要标记的方式标记某物。想象一下<div id="wrapper">变成<wrapper>...

网络正在走向一个巨大的应用商店,我们需要拥抱它。我们使用的标记不应该对我们不利,它应该对我们有用。本规范就是为了做到这一点。最终摆脱愚蠢的规则和标准,并为我们开发人员提供完全的编码自由,因为我们希望为 Web 带来更语义、更干净和人类可读的标记。

在某种程度上,AngularJS 为我们带来了 HTML6 的所有优点,但让我们今天仍然可以使用它。在过去的 15 年中,网络的使用方式发生了巨大变化,我们的工具仍然远远落后。对我们来说幸运的是,未来是光明和希望的灯塔,AngularJS 将未来带回到现在。

于 2013-10-27T17:35:54.147 回答
3

相当有趣的观察和问题,以及@mortalapeman 的一个很好的回答。

我想补充一点,html 的功能,以及我们对它应该做什么的期望正在改变。我们被教导将我们的行为完全排除在文档 (html) 之外,而是将我们的代码设置为挂钩到文档而不污染文档。

对于 Angular,html 的工作不仅仅是作为一个文档,它是一个应用程序的表示层,对我来说这是一项更大的工作。为了完成这项工作,Angular(和类似的框架)允许我们以声明的方式对我们的数据和行为进行双向绑定,同时,正如 mortalapeman 指出的那样,保持我们的数据和行为良好的范围和分离,以及可测试。

其实现在想来,保持一个立场,你的html应该是一个纯文档,但同时包含按钮和其他控件,说明它不仅仅是一个文档,其实有点傻。也许只有我一个人,但我觉得这很矛盾。对我来说,我们声明在操作控件时应该触发什么动作对我来说非常有意义。

于 2014-03-09T02:03:43.353 回答
3

我最近在学习 Angular 并且有完全相同的想法,这不违反关注点分离吗?他们在他们的网站上给出的例子“不要违反关注点分离!” 在过去 10 年参与 MVVM 和 MVC 之后,我认为 Angular 是回到冷融合时代的一步。并不是说 Cold Fusion 和 Angular 不强大,它们只是糟糕设计的促成因素。

所有 SDLC 研究表明,软件总成本的 50-60% 用于维护,而不是开发!但大多数开发人员认为(由于截止日期)他们只需要把它拿出来,值得称赞的是,他们做到了!然而,项目结束,开发人员离开,剩下的人想知道如何支持这个代码库。

我们已经了解 OOP 和 OOD 多年,并且最近才看到尝试通过 JQuery 之类的扩展将 Javascript 带入这一问题,尽管在 Javascript 真正成为一种 OOD 语言之前,它及其所有扩展都不会真正实现。“全局变量不好”上面的评论是一个很好的评论,但在强类型语言中,它从来都不是问题。只有当框架支持开箱即用时才会发生这些类型的问题!如果需要,强类型语言可以具有全局变量,但在这些语言中,作用域是王道,它是最先教授的内容之一。

我多年来的经验是,程序员是第一位的 1) 在他们认识到构成良好技术的模式之前快速完成工作。2)每个主要机构都有大量代码需要严格重构 3)可扩展性问题直到多年后才出现 4)重构工具的努力是巨大的!所有这些对于工作保障来说都是好消息,但与此同时,为什么不从一开始就正确地做到这一点呢?

JQuery、Javascript 甚至 Angular 都有自己的位置,但它们也是鼓励那些不知情的人进行糟糕设计的框架。我发现所有编程中最重要的一个模式是“观察者模式”,我们在创建事件处理程序和创建事件的能力中看到了这种模式。然后,脱钩也变得非常重要。如果您的代码在事件上很重要并且事件处理机会很大,那么您正朝着正确的方向前进。如果您正在重用代码并且严格不重复某些事情,那么您做得很好。最后,如果您对重构充满热情并真正了解基于接口的编程技术的力量,那么您做得很好。哦,是的另一件事,如果您知道依赖注入的全部内容,那么您就是程序员大军中的 5 星将军。三月,

于 2014-09-24T13:01:10.093 回答
1

在过去的两年里,我在一个大型项目中一直在使用 Knockout.js(它与 angular 的数据绑定概念非常相似)。我看到在标记中只有一些函数名称而不是整个函数实现的主要优点是可以在不更改标记的情况下轻松更改实现。特别是如果标记不是完全由您控制的,就像我们的例子一样。

设计师更改了标记以适应视觉要求,而我们只是告诉他不要弄乱数据绑定属性。当然,有时他对标记进行了如此大的更改,以至于我们需要更改数据绑定属性,但这主要意味着将它们从一个标记移动到另一个标记,实现没有改变。

于 2013-10-27T15:41:49.380 回答