角度的JS

雇用 Top 3%Freelance 角度的JS开发人员

托塔尔是最佳AngularJS开发人员,工程师,程序员,编码人员,架构师和顾问的市场。顶级公司和初创企业选择Toptal 角度的JS自由职业者来执行其关键任务Web开发项目。

无风险试用,仅在满意时付款。

客户评价 托塔尔 角度的JS 开发者4.4 / 5.0平均625条评论。 (最近更新时间: )

受到领先品牌和初创企业的信任

雇用Freelance 角度的JS开发人员和工程师

穆罕默德·穆塔赫(Muhammed Mutahr)

自由职业者AngularJS开发人员

美国托塔尔 Member Since March 2, 2018

Muhammad是一位高级软件工程师,在公共教育部门(WSU),私营医疗保健公司(Meridian)和汽车行业(GM的《财富》世界500强公司)等行业拥有多年​​经验。&AAM)。在他的整个职业生涯中,他使用HTML / 的CSS设计网络应用程序,使用JavaScript框架(Angular / 离子性)开发了客户端应用程序,并使用Java和C#开发了强大的服务器端应用程序。

展示更多

马从文

自由职业者AngularJS开发人员

美国托塔尔 Member Since November 4, 2017

Congwen是一位专门的Web开发人员,专门研究使用实际框架开发全栈Web应用程序。他'他热衷于为他人解决问题,对他而言,一个好的解决方案通常需要一定的创造力,然后需要更多的精力去适应和完善。

展示更多

瑞安·彼得森(Ryan J.Peterson)

自由职业者AngularJS开发人员

美国托塔尔 Member Since June 18, 2013

Ryan是一名顶级建筑师,企业家和开发人员。他在构建可云扩展,可扩展的软件和系统方面具有公认的能力。他编写的代码可以随着业务系统和需求适应市场需求或以核心业务方向为中心而随着时间的推移进行维护和扩展。

展示更多

帕特里克·基努姆

自由职业者AngularJS开发人员

美国托塔尔 Member Since June 11, 2018

帕特里克(Patrick)是一位资深的全栈工程师,在开发美观,可靠和可扩展的产品方面拥有10多年的经验。他热衷于将创意从概念引入到发布,与各个级别的技术敏锐度的客户合作,并开发有助于公司发展的产品。

展示更多

乔纳森·塞勒

自由职业者AngularJS开发人员

以色列托塔尔 Member Since July 24, 2014

乔纳森(Jonathan)是一位积极进取的开发人员和架构师,具有独特的优势:他的沟通能力和从上至下的理解软件项目的能力。他的经验将他带入了广泛的开发环境,从初创公司到财富500强。

展示更多

布莱斯·奥特

自由职业者AngularJS开发人员

美国托塔尔 Member Since April 17, 2014

Bryce拥有近20年的工程师,架构师,总监,副总裁和CTO的工作经验,他对任何项目的企业软件,管理和技术策略都具有深刻的了解。他的专长包括Amazon Web 服务,实时系统,商业智能,大数据,企业Web应用程序,可伸缩性,教育和开源软件。

展示更多

丹尼斯·伊珀尔

自由职业者AngularJS开发人员

荷兰托塔尔 Member Since March 14, 2014

丹尼斯(Dennis)是一位具有15年以上经验的创意技术专家,已经为英国伦敦的顶级广告代理商和制作公司工作了八年以上。他制作高端网站,数字装置和移动应用程序,并专门研究3D,VR和AR。他曾为耐克,法拉利,菲亚特,Mini,EA,迪斯尼,联合利华和英特尔等客户服务,并且是Android 3D开源框架Rajawali的创建者和首席开发人员。

展示更多

佐兰·梅利斯(Zoran Melis)

自由职业者AngularJS开发人员

克罗地亚托塔尔 Member Since November 12, 2014

Zoran是一位软件工程师,在各种技术领域拥有十多年的专业经验。他曾经使用过C / C ++,Python,Go,JavaScript,Java等。目前,他专注于全栈,可扩展的应用程序开发,已成为从小型私营公司到Google的各种规模的团队的成员。

展示更多

梁大卫

自由职业者AngularJS开发人员

美国托塔尔 Member Since October 23, 2017

David是一位全职工程师,拥有超过12年的Web开发经验,负责管理开发过程的各个方面。他'从事了50多个项目,解决了行销,医疗保健,电子商务,房地产和汽车保险等各个行业的复杂业务问题。大卫一直在节省成本的同时增加利润。他'准备有机会利用他的技能成倍增长您的收入。

展示更多

拉希德·瓦基里(Rashid Wakileh)

自由职业者AngularJS开发人员

美国托塔尔 Member Since November 17, 2014

拉希德(Rashid)是一位充满热情的首席前端工程师。他是测试驱动开发的专家,并且在领导团队创建软件解决方案方面拥有丰富的经验。他喜欢使用JavaScript框架并全面测试其代码的各个方面。

展示更多

立即注册以查看更多个人资料。

开始招聘

招聘指南

雇用优秀AngularJS开发人员的指南

尽管AngularJS具有平缓的初始学习曲线,但强大而灵活的框架在很大程度上取决于开发人员的技能和对框架的理解,以生成设计良好且可维护的应用程序。本招聘指南提供了一系列有见地的问题,以帮助您确定在其领域内非常出色的AngularJS开发人员。

阅读招聘指南

角度的JS招聘资源

更多资源来雇用AngularJS开发人员

职位描述模板

面试问题

常见错误

提示与实践

信任飞行员
托塔尔 in the press

...使公司能够快速组建对特定项目具有适当技能的团队。

Despite accelerating demand for coders, 托塔尔 prides itself on almost Ivy League-level vetting.

我们的客户
构建一个跨平台的应用程序以供全球使用
蒂埃里·雅基切维奇(Thierry Jakicevic)
构建一个跨平台的应用程序以供全球使用
1
2
3
为游戏创建一个应用
科纳·肯尼
为游戏创建一个应用
1
2
3
引领数字化转型
埃尔玛·普拉泽(Elmar Platzer)
引领数字化转型
1
2
3
感言

Tripcents会 '没有Toptal就存在。 托塔尔 Projects使我们能够与产品经理,首席开发人员和高级设计师一起快速发展我们的基础。在短短60天内,我们从概念发展到了Alpha。速度,知识,专业知识和灵活性是首屈一指的。 托塔尔团队是Tripcents的任何内部团队成员,也是Tripcents的一部分。他们像其他所有人一样做出了贡献并获得了开发的所有权。我们将继续使用Toptal。首先,它们是我们的秘密武器。

布兰特利·佩斯(Brantley Pace),首席执行官& Co-Founder

Tripcents

我们对Toptal的经验感到非常满意。与我一起工作的专业人员在几个小时内就与我通了电话。与他讨论我的项目后,我知道他是我想要的候选人。我立即雇用了他,他不花时间去参加我的项目,甚至通过添加一些很棒的设计元素来增强我们的整体外观而付出了更多努力。

董事Paul Fenley

邓恩& Associates

与我配对的开发人员令人难以置信-聪明,有驱动力和反应灵敏。过去很难找到质量工程师和顾问。现在不是't.

瑞安·洛克菲勒(Ryan Rockefeller),首席执行官

拉迪厄斯

托塔尔立即了解我们的项目需求。从第一天起,我们就与一位来自阿根廷的杰出自由职业者相匹配,这位自由职业者专注于我们的行业,与我们的团队无缝融合,了解我们的愿景,并取得了一流的成绩。 托塔尔使与高级开发人员和程序员的联系变得非常容易。

联合创始人Jason Kulik

ProHatch

作为一家资源有限的小公司,我们可以 '不能承担昂贵的错误。 托塔尔为我们提供了一个经验丰富的程序员,他能够扎实地工作并立即开始做出贡献。这是一次很棒的经历,我们'd再次心跳重复。

校长Stuart Pocknee

特定于站点的软件解决方案

我们使用Toptal聘请了具有丰富Amazon Web 服务经验的开发人员。我们采访了四名候选人,其中一位最适合我们的要求。该过程快速有效。

AbnerGuzmánRivera,首席技术官兼首席科学家

照片Kharma

Sergio是一位很棒的开发人员。一流,响应迅速,高效地完成了工作。

丹尼斯·鲍德温(Dennis Baldwin),首席技术专家兼联合创始人

PriceBlink

与Marcin合作是一件乐事。他胜任,专业,灵活并且非常快速地了解需要什么以及如何实施。

首席技术官AndréFischer

开机自检

我们需要一个可以立即开始我们项目的专家工程师。 Simanas的工作超出了我们的期望。无需采访和追逐专家开发人员,这可以节省大量时间,并且使每个人都对我们选择平台以使用更强大的语言感到满意。 托塔尔使该过程变得轻松便捷。现在,Toptal是我们寻求专家级帮助的第一位。

Web开发高级副总裁Derek Minor

网络世界媒体集团

托塔尔's developers 和 architects have been both very professional 和 easy to work with. The solution they produced was fairly priced 和 top quality, reducing our time to launch. Thanks again, 托塔尔.

杰里米·韦塞尔斯(Jeremy Wessels),首席执行官

科尼西

我们在Toptal方面拥有丰富的经验。他们将我们与适合我们应用程序的完美开发人员配对,使过程非常容易。超出初始时间范围也很容易,而且我们能够在整个项目中保留相同的承包商。我们绝对推荐Toptal来快速,无缝地找到高质量的人才。

首席技术官Ryan Morrissey

应用商业技术有限公司

I'm incredibly impressed with 托塔尔. Our developer communicates with me every day, 和 is a very powerful coder. He's a true professional 和 his work is just excellent. 5 stars for 托塔尔.

Pietro Casoar,首席执行官

罗宁游乐有限公司

与Toptal的合作经验非常丰富。在使用它们之前,我花了很多时间采访其他自由职业者,'找不到我需要的东西。与Toptal接触后,他们在短短几天内就将我与完美的开发人员配对。开发者我'与他合作不仅提供了高质量的代码,而且还就我以前没有的东西提出了建议't thought 的. It'对我来说很清楚,阿毛里知道他在做什么。强烈推荐!

首席执行官郑

Bulavard,Inc.

作为Toptal合格的前端开发人员,我还经营自己的咨询业务。当客户来找我帮助填补他们团队中的关键角色时,Toptal是我唯一推荐的地方。托塔尔'整个候选人池就是最好的。最高是我最物有所值'我们发现了将近五年的专业在线工作。

首席技术官Ethan Brooks

朗格茨专利&商标工程有限公司

在Higgle中's early days, we needed the best-in-class developers, at affordable rates, in a timely fashion. 托塔尔 delivered!

首席执行官Lara Aldag

闲聊

托塔尔使寻找候选人变得异常容易,使您放心,他们具备应聘技巧。我绝对会向任何寻求高技能开发人员的人推荐他们的服务。

数据经理Michael Gluckman

退出

托塔尔能够迅速将我们的项目与最优秀的开发人员进行匹配的能力真是太棒了。开发人员已成为我们团队的一员,他们每个人所表现出的专业承诺水平令我感到惊讶。对于那些希望与最好的工程师进行远程合作的人,Toptal就是您的最佳选择。

创始人Laurent Alis

Livepress

托塔尔使寻找合格的工程师变得轻而易举。我们需要一个经验丰富的ASP.NET MVC架构师来指导我们的启动应用程序的开发,Toptal在不到一周的时间内为我们提供了三个不错的候选人。做出选择后,工程师立即上线并开始运作。这比必须自己发现和审查候选人要容易得多。

联合创始人Jeff Kelly

协调解决方案

We needed some short-term work in Scala, 和 托塔尔 found us a great developer within 24 hours. This simply would not have been possible via any other platform.

弗兰科·阿尔达(Franco Arda),联合创始人

WhatAdsWork.com

托普塔尔(Toptal)为正在快速发展和规模化的企业提供不妥协的解决方案。我们每个工程师'通过Toptal签约的ve已迅速融入我们的团队,并以最高的质量标准保持他们的工作,同时保持了飞速的发展速度。

格雷格·金博尔(Greg Kimball),联合创始人

nifti.com

如何通过Toptal雇用AngularJS开发人员

1

与我们的一位行业专家交谈

A 托塔尔 director 的 engineering will work with you to understand your goals, technical needs, 和 team dynamics.
2

与手工挑选的人才一起工作

在几天之内,我们'将向您介绍适合您的项目的AngularJS开发人员。平均比赛时间不超过24小时。
3

合适的,有保证的

与新的AngularJS开发人员一起试用(仅在满意时付款),以确保他们'在开始参与之前重新选择合适的衣服。

常见问题

  • How are 托塔尔 角度的JS developers different?

    在Toptal,我们对AngularJS开发人员进行了全面筛选,以确保我们只与具有最高才能的人才相匹配。每年申请加入Toptal网络的100,000多人中,晋级的比例不到3%。您将与工程专家(从不聘请一般招聘人员或人力资源代表)合作,以了解您的目标,技术需求和团队动力。最终结果:专家审核了我们网络中的人才,并根据您的业务需求进行了定制匹配。 现在开始。

  • Can I hire 角度的JS developers in less than 48 hours through 托塔尔?

    根据可用性和进度的快慢,您可以在注册后48小时内开始与AngularJS开发人员合作。 现在开始。

  • What is the no-risk trial period for 托塔尔 角度的JS developers?

    我们确保您和您的AngularJS开发人员之间的每次互动都以长达两周的试用期开始。这意味着您有时间确认参与将成功。如果您对结果完全满意,我们将为您收取时间费用,并继续为您服务。如果您不完全满意,则无需付费。从那里,我们可以分开,也可以为您提供另一位更合适的专家,我们将与他一起开始第二次无风险的试验。 现在开始。

分享
角度的JS

如何雇用一个伟大的AngularJS开发人员

角度的JS是多个高端Web应用程序的首选框架。许多团队之所以选择这种技术,是因为它灵活,强大,似乎朝着正确的方向发展,拥有强大的社区以及无数的扩展和集成。

还有许多Angular开发人员。虽然从Angular开始很有趣,并且构建小型单页应用程序不是很困难,但是即使维护小型应用程序也可能很困难。直到今天,已经记录和讨论了大量的良好实践和先进技术,并且出现了一些高质量的标准。

我们的招聘指南将帮助您找到致力于遵循这种高质量方法的全职和兼职AngularJS开发专家。这是一种可以吸引客户的优秀应用程序的方法。在本指南中,我们将涵盖与范围,摘要循环,服务,测试等相关的概念。

使用范围

范围是Angular应用程序的数据模型。它们是应用程序开发过程中唯一的真理来源,应严格限制和处理它们。处理范围有很多警告。我们将在下面描述一些重要的方面。

问:作用域继承在AngularJS中如何工作?描述将数据传递到合并范围的各种方式。

角度的JS中的作用域继承是子作用域的原型,但不是孤立作用域的原型。创建新作用域的核心指令使用子作用域选项。这些范围可以访问在父范围上设置的模型。访问父范围模型对对象无缝工作,但是当尝试写入原始模型(例如字符串)时,将在子范围上创建一个新模型。父作用域上的模型将被遮罩或阴影化。

构建自定义指令时,可以创建一个隔离的作用域。孤立的合并范围无法直接访问其父级模型。不过,可以通过在指令的scope属性对象中指定绑定来手动设置绑定。在这种情况下,可以通过HTML属性将数据传递到指令中。它支持双向和单向绑定,也支持表达式绑定。

指令还具有将范围排除到包含的元素上的能力。手动使用包含时,可以创建一个克隆的作用域-一个保留父级所有属性但会丢失所有绑定的作用域。该功能没有很好的记录。

在这一点上,非常重要的一点是要注意,可以在所有方向上遍历示波器。每个范围都有一个$ parent属性(根范围为“ null”),还有\(childHead,\)childTail,\(prevSibling和\)nextSibling属性。使用这些属性可以在作用域之间进行通信,尽管这可能很困难,而且也不是一种很好的做法。

问:控制器到底是什么?它们的生命周期是什么,与范围有什么关系?

控制器是类,即构造函数,它们通过指令“ ng-controller”,路由或指令绑定到范围和HTML的一部分。设置控制器将创建一个新的作用域(子作用域)。控制器的目的是设置范围的初始状态,并通过添加行为,设置监视,事件侦听器等来操纵它。

尽管乍一看控制器似乎是AngularJS的主要操作基础,但是一旦专门的开发人员真正了解了AngularJS范围的用途,它们对控制器的使用就会减少。直接对示波器模型执行计算并不是最佳选择,因为可能会受到注意,实际上可能会触发并减慢摘要阶段。超越MVC框架的座右铭-“保持控制器精简”-非常适用于AngularJS。

控制器受其作用域的约束,生命周期也受其约束。创建新作用域后,$ compile服务将在作用域上设置初始监视。到那时,可以操纵示波器,可以创建,修改或破坏示波器上的模型,可以设置新的手表和侦听器。为了使更改生效,需要触发摘要阶段。这样可以观察并响应模型突变(这是一种反应,因此是下一步)。范围的生命周期以其毁灭而结束。在这种情况下还会触发其他事件。尽管这可能会像JavaScript闭包一样持续存在,但这通常还是控制器兴趣的终结。

问:请解释一下AngularJS中使用“。$ eval()”和“ $ parse()”的含义。

“。$ eval()”是一个简单的作用域方法,它使用一个表达式(以及可选的本地变量),然后使用“ $ parse()”对当前作用域执行该表达式。

服务“ $ parse()”是神奇的地方。它采用Angular表达式并返回一个函数,该函数带有两个参数:“ context”和“ locals”。后者用于覆盖上下文中设置的变量。上下文是关键部分。

这个问题的一个好帮手问题是: 作为开发人员,您是否曾经想过,为什么核心Angular指令仅采用在作用域上设置的模型名称? 例如:‘<按钮ng-click =“ foo = 5”>将范围模型foo的值设置为5</button>`。在指令中,范围对象是隐式的。实际发生的情况是:解析传递给ng-click的表达式,该表达式返回一个函数,然后使用作为上下文传递的当前作用域执行该函数。

$scope.foo = 3;
var parseFn = $parse(‘foo = 5’);
parseFn($scope);
$scope.foo; // returns 5

或更短:

$scope.foo = 3;
$scope.$eval(‘foo = 5’);
$scope.foo; // returns 5

$ parse有很多用例,因为它确实是一项很棒的服务。一种特别有用的方法是在无法保证该属性在任何级别都不为空的情况下检查对象的深层嵌套属性。

$parse(‘bar.baz.quux’)(foo);

…如果foo.bar未定义,将返回undefined。如果尝试直接访问“ quux”,JavaScript将引发异常。

另一个更特定的用例是允许用户声明变量并为其分配值,例如在文本输入字段中,然后在其他输入字段(及更多)中重用变量。例如计算器或记事本应用程序。为了确保安全,可以将范围用作变量的上下文。 “。$ eval()”和“ $ parse()”将在那里发挥关键作用。

使用摘要循环

摘要循环用于使DOM与示波器上设置的模型保持同步。在Angular中,摘要周期中经常遇到问题。对摘要循环的深入了解很少见。

被采访的开发人员应该熟悉摘要循环及其工作方式。构建大型应用程序时,对这些知识的需求会早于稍后出现。以下问题将帮助您评估他们的熟练程度。

问:AngularJS如何知道何时执行脏检查和更新DOM输出?

答案很短-要求这样做。关键是,没有可以自动触发脏检查的轮询机制。核心AngularJS指令,服务和方法通常会设置监视程序,或显式触发摘要循环。该过程被执行 内部地,它没有公开,并且对开发人员来说可能并不明显。实际上,有些文章与事实相矛盾,错误地指出AngularJS中存在持续不断的心跳。哪有这回事。

使用非核心功能操作范围模型需要开发人员手动触发摘要周期。在大多数情况下,这是通过使用范围方法“。$ apply()”完成的,该方法触发了根范围的摘要。该阶段向下传播到每个子范围。

没有任何东西触发摘要,脏检查就不会发生。监视的回调将不会触发,并且DOM输出将不会更新。

问:“。$ apply()”和“。$ applyAsync()”有什么区别?为什么要选择一个?

它们之间的主要区别是后者发生在0超时上。实际延迟约为10毫秒。连续的“。$ applyAsync()”调用会取消以前的超时。关键是,对于多个“。$ applyAsync()”调用,将只有一个摘要触发,而不是每个调用一个。常规的“。$ apply()”就是这种情况。

此时,原因应该很明显-主要问题是性能。对您的范围进行某种更改,仅在几分之一秒内重做或再次更改它通常是多余的。 $ applyAsync()有助于避免这种情况。

问:“。$ digest()”和“。$ apply()”有什么区别?为什么在作用域上调用“。$ digest()”?

有一些区别。首先,“。$ apply()”接受一个参数,一个表达式,并根据当前范围对其进行求值。 “。$ digest()”不接受任何参数。

其次,“。$ apply()”在根作用域上调用“。$ digest()”。该摘要将向下传播到每个子作用域-最终将影响应用程序中的每个作用域。直接在范围上调用“。$ digest()”不会影响层次结构中更高的任何范围。这意味着将不会评估在父作用域上设置的任何监视。

同样,开发人员可能要调用“。$ digest()”而不是“。$ apply()”的原因是性能。使用隔离的组件(例如小部件,这些小部件与应用程序的其余部分无法通信。更准确地说-已知不会影响在父作用域上设置的任何模型。

但是,这不是常见的做法。根据经验,最好使用“。$ apply()”。

服务

角度的中的服务是保持业务逻辑的地方。即使在核心Angular中,也存在不止一种(甚至超过两种)受支持的创建服务的方式。对于处理服务的最佳方法,样式指南有很多话要说。您认为雇用的工程师也应该!

从通过通信,持久性模型正确应用模式到处理客户端数据存储,Angular中的服务通常由高级,复杂的方法组成,应在整个应用程序中重复使用。业务逻辑本身需要精通JavaScript。将其绑定到开发人员的Angular要求,以了解他或她打算使用哪种类型的结构。

问:请说明何时使用服务,何时使用工厂以及何时使用提供程序。

这三个在内部几乎相同。初始化后,服务将返回工厂,工厂又将返回提供者。

服务和工厂之间的区别在于如何声明和初始化它们。服务是构造函数,它们是实例化的,也就是说,在首次加载时会创建一个“新”实例。结果是,在声明服务时,其所有方法都被定义为“ this”的属性。另一方面,工厂应返回对象文字。

有意识地使用提供程序是有好处的,因为可以在所有服务可用之前在“ config()”块中对其进行配置。声明名为例如Angular注册了“ api”两个可注射对象:“ api”和“ apiProvider”。

function api() {
  this._apiUrl = '';

  this.$get = function () {
    var that = this;
    var hostObject = {
      printApiUrl: function () {
        return ‘api address is ' + that._apiUrl;
      }
    };
    return hostObject;
  };
}

angular.module(‘myApp’)
  .provider(‘api’, api);

angular.module(‘myApp’)
  .config(function (apiProvider) {
    apiProvider._apiUrl = ‘http://a-great-api.com';
  })
  .controller(’NewCtrl’, function ($scope, api) {
    $scope.apiName = api.printApiUrl();
  });

问:AngularJS中的服务是什么?它们何时初始化?

角度的服务是单例-在应用程序的生命周期中只有一个实例可用。 角度的 lazy加载其模块,因此所有服务在被注入“ run()”块或另一个模块(当然也需要初始化)之后才变得可用。

提供者在此之前变得可用,因为它们可以在“ config()”块中轻松使用。那时它们的核心功能仍然不可用。它可以被操纵。

问:AngularJS提供了哪些HTTP通信方式?描述并解释至少两个之间的差异。

角度的处理XHR的两个核心服务是“ $ http”和“ $ resource”。后者实际上需要显式安装,而“ $ http”很容易获得。

“ $ http”是一个低级模块,已经提供了很多功能,但是将其与RESTful API一起使用可能会导致代码重复,并且有些原始。该模块可用于使用XML HTTP请求或JSONP进行通信。使用起来相当简单。

另一方面,“ $ resource”是基于“ $ http”构建的高级服务,旨在与RESTful API通信。它是为处理标准服务器端资源而构建的。它提供了丰富的api,允许声明和重用多个已定义的参数,甚至可以在同一路径级别上交替使用的参数。它提供了标准操作(“更新”除外,但在模块文档中将其作为示例进行了说明)。它还允许定义新动作。

“ $ http”和“ $ resource”都有一个共同点,即“ $ httpInterceptors”。下一节将详细介绍。

第三种选择是 矩形。 矩形是一个有用的模块,它是$ resolve的替代模块。它具有不同的丰富API,主要在Promise上运行,并且应该具有更简单的语法。实际上,开发人员认为$ resource有点令人困惑。 矩形允许您即时生成新类型的请求。这是一个相当流行的模块。另一方面,最近没有很多提交。

角度的JS具有强大的功能。为了能够使用它,开发人员经常需要挖掘文档,在博客和论坛上描述的技术以及源代码。 在花了一些时间使用AngularJS构建客户端应用程序之后,工程师扩大了对AngularJS的了解。寻找最佳方法的结果打开了新的道路。经验丰富的开发人员应至少对以下问题和解答中描述的案例有所了解。它们都与使用Angular的高级方面有关。开发人员流畅地讨论它们可能会向您表明他们对框架的透彻理解。

问:相对于指令,什么是包含?有手动控制包含的方法吗?

包含是指令的属性,它使指令可以包含和访问元素,这些元素在HTML层次结构中在其中声明但在模板中未声明。

轻量级指令就是一个例子,该指令应用于元素时会为其创建一个新范围,该范围也将应用于所有包含的元素。

<div>
  <p>PARENT SCOPE:</p>
  <p>foo: {{ foo }}</p> <!-- assuming foo === 1 -->
  <p>bar: {{ bar.hotNumber }}</p> <!-- assuming bar.hotNumber === 1 -->
  <div light-scope>
    <p>CHILD SCOPE</p>
    <p>foo: {{ foo }}</p>
    <p>bar: {{ bar.hotNumber }}</p>
    <button ng-click="foo = 2">change foo</button>
    <button ng-click="bar.hotNumber = 3">change bar.hotNumber</button>
  </div>
</div>

这可以是视图模板,请注意,指令“ light-scope”绑定到的“ div”的内容不是该指令模板的一部分。

function lightScope() {

  function postLink(scope, element, attrs, controller, transclude) {
    
    // allow to set isolated scope,
    // but not 通过  default
    var isolateScope = false;
    if (attrs.lightScope === 'isolated') {
      isolateScope = true;
    }

    // there are two scopes: 
    // one created 通过  the directive in the definition, through `scope: true`, 和 
    // another one created just above...    
    var newChildScope = scope.$parent.$new(isolateScope);

    transclude(newChildScope, function (clone) {
      element.append(clone);
    });

    // ... so the second scope needs to be destroyed manually.
    scope.$on('$destroy', function () {
      newChildScope.$destroy();
    });

  }

  var directive = {
    link: postLink,
    restrict: 'E',
    scope: true,
    transclude: true
  };

  return directive;

}

angular.module('lightScope', [])
.directive('lightScope', lightScope);

很明显,“ transclude()”函数非常有趣。我们为它提供一个任意范围,并且可以将其附加到DOM元素。它将传播到HTML层次结构中的以下元素。

请参考 $ compile服务的官方文档,它们非常出色:

问:是否可以在AngularJS中全局处理HTTP请求?描述您的方法。

是的,可以拦截请求,而Angular提供了一个很棒的API-“ $ http”拦截器。 “ .interceptors”是一个数组,可从“ $ httpProvider”获得,因此可以从“ .config()”块进行操作。该数组应包含返回对象的函数,基本上是工厂。

可以在以下位置截获请求:请求(恰好在发送之前),请求错误,响应成功和响应错误。

考虑到“ $ resource”也依赖于“ $ http”来覆盖XHR,并且传递给$ httpProvider.interceptors数组的函数可以是普通的Angular工厂,使用拦截器是对HTTP请求进行一般全局操纵的一种好习惯。

问:根范围与所有其他范围有何不同?

“ $ rootScopeProvider”是一项服务。这是一个单例;它没有父母,兄弟姐妹或其他根。它是直接从“ Scope()”类创建的,而不是通过另一个范围的“。$ new”方法创建的。

也许最大的区别在于根作用域的使用方式。开发人员的主要用途是事件处理。在Angular中,“。$ broadcast()”和“。$ emit()”是触发事件的方法,它们分别在范围层次结构中向下或向上发送。效果在根范围内是最佳的,即“ $ rootScope。$ emit()”将仅由在根范围上设置的侦听器捕获,而“ $ rootScope。$ broadcast()”将到达应用程序中的所有侦听器。

不应在根范围上设置模型。该范围可以看作是全局名称空间的一种形式,尤其是在范围上下文中评估表达式时。污染全局名称空间几乎从来不是一个好习惯。 角度的文档中的建议是仅对数据的一小部分使用根范围,这对整个应用程序(全局变量)很有用,但对功能不起作用。

测验

无需编写测试就可以构建应用程序。幸运的是,Angular在构建时就考虑了可测试性。编写测试要求开发人员根据测试的Angular结构类型学习和应用不同的方法。在不了解软件开发良好实践的情况下,其中一些差异可能是微妙和难以理解的。其他可能包括实现相同目标的替代方法。

为持续集成环境设置测试也是Angular开发人员的责任。否则还有谁会照顾呢?虽然此处介绍的技术不是 需要 为了构建出色的应用程序,出色的应用程序背后的大多数团队都非常看重它们。

问:单元测试控制器和服务-有什么区别?

单元测试控制器和服务之间的主要区别在于关注的差异。控制器用于设置它们绑定到的范围的初始状态和行为。我们可以说直接或使用// this //关键字在范围上设置的所有模型都是公共的。这仍然有点类似于服务的公共属性。控制器不应包含业务逻辑。

在单元测试控制器中,人们可以期望对模型的初始值有更多的保证,而逻辑则更少。控制器方法中的逻辑应该主要只是将UI动作耦合到服务。与当前视图和范围没有紧密绑定的所有功能都应委托给服务。开发人员肯定会在控制器测试中比在服务测试中对模拟服务对象设置更多的间谍。

相反,应首先对服务进行测试以进行正确的业务逻辑处理。

问:请描述一种测试指令的方法。

指令负责处理自定义HTML标签中的新功能和/或复杂功能。指令是通过HTML设置的,在大多数情况下,其效果会直接影响应用程序的用户界面。这与服务不同,服务的效果通常会对UI产生间接影响。

许多指令在其postLink函数中具有所有逻辑。该功能不会像控制器,服务和过滤器那样添加到模块中,因此无法注入。除非它们在全球范围内可用,否则在测试时很难直接到达它们。

推荐的,使用单元测试测试指令的官方方法是注入“ $ compile”服务,将其上设置了指令的单个HTML元素传递给它,然后针对某个范围(例如根范围。此后,将手动调用摘要阶段,然后测试编译的HTML元素的预期结果。

it('Should compile to expected results', function() {
    var element = $compile('<div widget-component></div>')($rootScope);
    $rootScope.$digest();
    expect(element.html()).toContain('Simple as that');
  });

这种方法相当快。测试指令对复杂用户操作的反应可能有点困难。这是量角器起作用的地方。 Protractor是针对AngularJS的测试框架,它是在webdriver之上编写的,可以对Selenium服务器执行测试。用于端到端测试。

测试指令的另一种方法是使用e2e测试几乎完全相同。在单元测试中编译指令是隔离指令的好方法。最终测试的通常是可见的HTML结果。这种替代方法是编写简单的HTML页面,这些页面会加载指令(及其依赖项),并将指令及其功能隔离在一个简单的页面上。没有路由,什么都没有-只是指令。这样的HTML页面尚未经过测试-这是一个标准示例。该测试需要针对该示例页面进行。在编写库时,此方法特别有用。

后一种方法的执行速度较慢。应用程序需要启动才能测试指令。但是,这样的测试具有很大的价值。在此过程中,创建了一个示例HTML页面-一个非常有用的工件,这带来了更多的价值。此类测试也许可以称为功能测试,而不是完整的e2e测试,因为开发人员仍应隔离行为并将最终应用程序正在使用的每个模块添加到示例HTML页面。

问:如何在更大的团队中或在生产环境中自动化测试?

这不是严格的AngularJS问题,而是经验丰富的前端开发人员至少应该对前端测试方面的连续集成环境如何工作有所了解。

首先,我们需要假设该项目受Git版本控制,并托管在GitHub,BitBucket或某些类似的代码存储库服务上。如果这时开发人员会提到gitflow,那就太好了,因为它是一种行之有效的方法。但更重要的是,开发人员应提及 钩子,例如GitHub webhooks。这些是事件处理程序,在 recent article on 托塔尔 博客,它允许响应各种存储库事件而对任意URL发出HTTP请求。例如,当有人将提交推送到存储库时,对第三方测试服务执行ping操作。

有多种服务,其中最引人注目的是另一个开源项目免费提供的GitHub产品Travis和SauceLabs,后者允许在移动设备上进行自动测试。这些工具将自动完成大部分配置,包括配置webhooks。前端开发人员将需要提供的是脚本,通常是bash脚本,类似于存储库的README.md文件中已经存在的脚本-客户端应用程序需要在第三者提供的计算机上安装和运行方测试服务。该脚本通常会安装所有依赖项,运行测试,构建应用程序,然后进行部署。最后一步至关重要。

成功完成测试后,连续环境应该将代码推送到远程服务器。作者从未使用过这样的过程来推动生产,但是他确实建立了几个系统,这些系统会自动执行到预生产服务器的部署,例如 发展分期。实际上,这些服务器再也无需手动推送。这种设置使开发人员不必自己进行构建-他们现在唯一需要做的就是提交代码并推送。更重要的是,它在另一台机器上运行测试。开发人员无论如何都要在本地测试他们的更改。如果测试在本地和远程都通过,则代码库很可能是稳定的。

结论

该招聘指南涵盖的职责和知识范围比前端开发人员历来所期望的要广。出色的Angular开发人员可能更多是工程师。调试硒问题,创建复杂的构建过程以及设置持续集成环境不只是客户端JavaScript。期望开发人员精通后者,但是应该具有经验和对应用程序更广泛的生态系统的理解。

出色的AngularJS开发人员能够将艺术融入工程中。

本指南还涉及一些领域,例如动画和渲染性能以及CSS / HTML专业知识。 角度的JS程序员不必是一流的设计师,但他们必须努力创建与所提供的设计一致的高性能应用程序。由于逻辑方面存在许多问题,因此如果该团队包括HTML / 的CSS开发人员,这将得到缓解。它们提供的静态HTML模板可以轻松地应用于Angular应用程序并与之结合。否则,尽管有时令人沮丧,但Angular中的动画还是有据可查且易于使用的。请参考 角度的JS开发人员最常犯的18条错误文章 有关客户端性能的更多信息。

最后,也许最重要的是交流技巧。专门的AngularJS开发人员很可能会成为您开发团队的主要交流节点。他们将需要不断与后端团队,HTML编码人员和设计人员合作。他们的工作将是最终客户直接与之交互的东西。从本质上讲,Angular开发人员将需要响应迅速,在其领域内是专家并且与所有人保持良好的关系。找到合适的人是一项艰巨的任务。 托塔尔使其更容易。

Featured 托塔尔 角度的JS Publications

德米尔·塞尔曼诺维奇(Demir Selmanovic)

异步JavaScript:从回调地狱到异步和等待

通过 德米尔·塞尔曼诺维奇(Demir Selmanovic)
伊戈尔·格绍斯基(Igor Geshoski)

使用Angular 4表单:嵌套和输入验证

通过 伊戈尔·格绍斯基(Igor Geshoski)

顶级AngularJS开发人员需求很高。

开始招聘