对于新手在我的前端,javascript还是有一半的了解,对直接JS来说,阻力实在是很多,但我相信,只要是硬的,连反人性的设计都不是大问题。



好吧,不要太多的谈话。为了弄清楚什么是角度JS,我先从范围开始,那么范围是什么正式文件的一段:

复制代码代码如下所示:

作用域是引用应用程序模型的对象。它,应用,它也被称为以下三个方面。



在看到它之后,类似于其他编程语言,它认为范围就像数据模型的范围,提供表达式执行的上下文。让我们先了解它。

范围特征

接下来,范围的特征是什么

范围提供了一种监视模型中更改的方法。

作用域提供一个应用程序方法来传播模型中的更改。

可以继承范围以隔离不同的应用程序组件和属性访问权限。

作用域提供表达式计算的上下文。

对于四个特点,因为之前我学习Actionscript,C++,java,所以第一,第三,第四是不难理解的,但第二感觉有点云里雾里,好奇的精神,我仍然眉目传情搜寻的东西。对于有经验的,请拍砖!

源的Javascript

首先,乍一看,scope.apply()似乎要让绑定更新的一种常用方法,但想的更多一点,我们为什么需要它你通常什么时候使用它要理解这两个问题,必须从Javascript开始,在Javascript代码中,它们按一定的顺序执行。当执行一个代码片段时,浏览器只执行当前的剪辑,不会做任何其他事情。当他们点击某事物时,他们会被卡住。Javascript的工作方式是其中一个原因,现在我们有了一段代码可以感觉到:

复制代码代码如下所示:

VAR按钮= document.getelementbyid('clickme);

功能buttonClicked(){

警报(单击按钮);

}

Button.addEventListener(听到咔哒声,buttonClicked);

功能timercomplete(){

警报('timer完成);

}

setTimeout(timercomplete,5000);



当Javascript代码加载,先找一个按钮叫ID叫clickme,然后添加一个监听器,然后设置超时。等待5秒,一个对话框会弹出。如果你刷新页面,点击clickme按钮,对话框会弹出,如果你不点击好吧,这timercomplete功能将永远没有机会执行它。

如何更新绑定

好了,在拉了一些看起来不相关的东西之后,我们回到重点。角JS知道数据和页面的变化需要什么时候更新吗代码需要知道什么时候修改数据,但是现在没有办法直接告诉对象上的数据已经改变了。虽然ECMAscript 5试图解决这一问题,它仍在试验阶段。目前,主流的策略有两种解决方案:一是使用一种特殊的对象,允许所有的数据将通过调用对象的方法,而不是直接指定的属性。在这这样,所有的变化,可以记录和页面需要更新页面时需要更新。这样做的缺点是,我们要继承的一种特殊的对象,任务只能由object.set(关键,币值)代替对象。键=值框架,这样作为emberjs和knockoutjs就是这么干的(虽然我没有接触过,不好意思)。另一个是角JS使用每个Javascr方式脚本代码的执行顺序来检查是否有任何变化的数据。它似乎并不高效,甚至严重影响性能。但角JS使用了一些更聪明的方法来解决问题(还没有被研究过,目前尚不清楚)。这样做的好处是,我们可以使用任意的对象,不限制转让的方式,并意识到数据中的变化。

角JS把这个解决方案,我们关心的是当数据发生了变化,这也是地方scope.apply()使用。检查绑定的数据到底有没有变化,实际上是由scope.digest(完成),但我们几乎从不直接调用这个方法,它调用scope.apply()方法,因为在scope.apply()方法,它会调用scope.digest()方法,scope.apply()方法接受一个函数或表达式,然后执行它,然后调用scope.digest()来更新绑定或观察者的方法。

何时使用美元()

这就是问题所在,我们究竟何时需要调用应用程序()方法的情况是非常少的,事实上我们几乎所有的代码包在scope.apply(),如ngclick,控制器的初始化,HTTP回调函数,在这种情况下,我们不需要给自己。事实上,我们不能称之为我们自己。否则,调用应用()方法适用于()方法会抛出一个错误。如果我们需要在一个新的执行顺序运行的代码,我们真的需要使用它,当且仅当新的执行顺序不受角的JS库的方式创造出来的,我们需要scope.apply包代码()。以下举例说明了:

复制代码代码如下所示:

{消息}



复制代码代码如下所示:

FunctionCtrl ($scope) {

scope.message美元=等待2000ms更新;

setTimeout(){()函数(

scope.message美元=超时调用!;

不知道更新范围 / / AngularJS美元

},2000);

}



上面的代码将在页面上显示:更新等2000ms。显然不是由角JS检测数据的更新。

接下来,我们修改Javascript代码,用scope.apply()。

复制代码代码如下所示:

functionctrl(范围){

scope.message美元=等待2000ms更新;

setTimeout(){()函数(

$范围($)函数(){()

scope.message美元=超时调用!;

});

},2000);

}



这一次,不像以前,第一页显示:更新等2000ms,等待2秒后,将内容改为:超时调用!很明显,数据更新是用角js来检测的。

注意:我们不应该这样做,但是我们使用的是角JS提供的超时方法,所以它会被应用方法自动包装起来。

科学是把双刃剑。

最后,让我们来看看scope.apply()和scope.apply(功能)的方法。虽然角JS已经做了很多事情对我们来说,我们已经失去了一些机会。一眼就从下面的伪代码:

复制代码代码如下所示:

功能应用(表达式){

尝试{

返回的eval(expr);

} catch(e){

ExceptionHandler美元(E);

最后,{ }

$ root($);

}

}



它捕获所有的异常,不会再次抛出,最后调用$摘要()方法。

总结



$()方法的应用可以执行js框架之外的角角的表达式,如DOM事件,setTimeout,XHR,或其他第三方库。这仅仅是个开始,水还是很深的,欢迎来到深潜水!