精通AngularJS(三)深入scope,继承结构,事件系统和生命周期
深入探讨 Scope 作用域 每一个 作用域的层次结构 让我们再来看看这个简单的 var HelloCtrl = function($scope){ $scope.name = 'World'; } 这个新的作用域是由 ng-controller指令就是
现在你已经知道了,一些指令会创建新的子级的作用域,你可能会想,为什么会需要这些复杂的东西。要想理解这一点,我们来演示一个例子,其中使用了 控制器如下: var WorldCtrl = function ($scope) { $scope.population = 7000; $scope.countries = [ {name: 'France',population: 63.1},{name: 'United Kingdom',population: 61.8},]; }; 模版如下: <ul ng-controller="WorldCtrl"> <li ng-repeat="country in countries"> {{country.name}} has population of {{country.population}} </li> <hr> World's population: {{population}} millions </ul> 这个 但这里有一个问题,就是,每一个 Scope的层次结构和继承定义在作用于上的属性对他的子级作用于来说是可见的,试想一下,子级作用域并不需要重复定义同名的属性!这在实践中是非常有用的,因为我们不必一遍又一遍的重复定义本来可以通过作用域链得到的那些属性。 再来看看前面的例子,假设我们想要显示给出的这些国家与世界总人口的百分比。要实现这个功能,我们可以在一个作用域上定义一个 $scope.worldsPercentage = function (countryPopulation) { return (countryPopulation / $scope.population)*100; } 然后被 <li ng-repeat="country in countries"> {{country.name}} has population of {{country.population}},{{worldsPercentage(country.population)}} % of the World's population </li> AngularJS中作用域的继承规则跟 JavaScript 中原型的继承规则是相同的(在需要读取一个属性的时候,会一直向继承树的上方查询,直到找到了这个属性为止)。 贯穿作用域链的继承的风险这种透过作用域层次关系的继承,在读数据的时候显得非常的直观、易于理解。但是在写数据的时候,就变的有点复杂了。 让我们来看看,如果我们在一个作用域上定义了一个变量,先不管是否在子级作用域上。JavaScript代码如下: var HelloCtrl = function ($scope) { }; 视图的代码如下: <body ng-app ng-init="name='World'"> <h1>Hello,{{name}}</h1> <div ng-controller="HelloCtrl"> Say hello to: <input type="text" ng-model="name"> <h2>Hello,{{name}}!</h2> </div> </body> 运行一下这段代码,就可以发现,这个 现在,我们一起来看看,如果在 在子级作用域中去改变父级作用域上面的属性有几种方法。第一种,我们就直接通过
另一个解决方案就是,不要直接把属性绑定到 作用域上,而是绑到一个对象上面,如下所示: <body ng-app ng-init="thing = {name : 'World'}"> <h1>Hello,{{thing.name}}</h1> <div ng-controller="HelloCtrl"> Say hello to: <input type="text" ng-model="thing.name"> <h2>Hello,{{thing.name}}!</h2> </div> </body> 这个方案会更可靠,因为他并没有假设 DOM 树的结构是什么样子。
作用域层级和事件系统 层级关系中的作用域可以使用 $scope.$on('$locationChangeSuccess',function(event,newUrl,oldUrl){ //react on the location change here //for example,update breadcrumbs based on the newUrl }); 每一个作用域对象都会有这个 类似于 DOM 事件,我们可以调用
虽然在作用域层级中传播事件对一些问题来说是一种非常优雅方案(特别是对全局的,异步的状态变化来说),但还是要适度使用。通常情况下,可以依靠双向数据绑定来得到一个比较干净的方案。在整个 AngularJS 框架中,一共只发出($emit)了三个事件(
作用域的生命周期作用域需要提供相互隔离的命名空间,避免变量的命名冲突。作用域们都很小,而且被以层级的方式组织起来,对内存使用的管理来说很有帮助。当其中一个作用域不再需要 ,它就可以被销毁了。结果就是,这个作用域所暴露出来的模型和方法就符合的垃圾回收的标准。 新的作用域通常是被 原文链接:http://www.peichao01.com/static_content/doc/html/Mastering_Web_Application_Development_with_AngularJS_3.htm (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |