AngularJS 限定$scope的范围实例详解


Posted in Javascript onJune 23, 2017

限定$scope的范围

JavaScript基于原型的继承与面向对象中基于类的继承有着微妙的区别,这通常不是什么问题,但这个微妙之处在使用$scope时就会表现出来。在AngularJS中,每个$scope都会继承父$scope,最高层称之为$rootScope。($scope与传统指令有些不同,它们有一定的作用范围i,且只继承显式声明的属性。)

由于原型继承的特点,在父类和子类间共享数据不太重要,不过如果不小心的话,也很容易误用了一个父$scope的属性。

比如说,我们需要在一个导航栏上显示一个用户名,这个用户名是在登录表单中输入的,下面这种尝试应该是能工作的:

<div

ng-controller="navCtrl">

  <span>{{user}}</span>

  <div

ng-controller="loginCtrl">

    <span>{{user}}</span>

    <input

ng-model="user"></input>

  </div>

</div>

那么问题来了……:在text input中设置了user的ng-model,当用户在其中输入内容时,哪个模版会被更新?navCtrl还是loginCtrl,还是都会?

如果你选择了loginCtrl,那么你可能已经理解了原型继承是如何工作的了。

当你检索字面值时,原型链并不起作用。如果navCtrl也同时被更新的话,检索原型链是必须的;但如果值是一个对象,这就会发生。(记住,在javascript中,函数、数组和对象都是对象)

所以为了获得预期的行为,需要在navCtrl中创建一个对象,它可以被loginCtrl引用。

<div
 ng-controller="navCtrl">

  <span>{{user.name}}</span>

  <div
 ng-controller="loginCtrl">

    <span>{{user.name}}</span>

    <input
 ng-model="user.name"></input>

  </div>

</div>

现在,由于user是一个对象,原型链就会起作用,navCtrl模版和$scope和loginCtrl都会被更新。

这看上去是一个很做作的例子,但是当你使用某些指令去创建子$scope,如ngRepeat时,这个问题很容易就会产生。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Javascript 相关文章推荐
Mootools 1.2教程 输入过滤第一部分(数字)
Sep 15 Javascript
js 删除数组的几种方法小结
Feb 21 Javascript
jquery实现弹出层完美居中效果
Mar 03 Javascript
个人总结的一些JavaScript技巧、实用函数、简洁方法、编程细节
Jun 10 Javascript
JavaScript程序中的流程控制语句用法总结
May 23 Javascript
jQuery获取单击节点对象的方法
Jun 02 Javascript
AngularJS 单元测试(二)详解
Sep 21 Javascript
详解Vue中添加过渡效果
Mar 20 Javascript
mui框架移动开发初体验详解
Oct 11 Javascript
JavaScript笛卡尔积超简单实现算法示例
Jul 30 Javascript
ES6使用 Array.includes 处理多重条件用法实例分析
Mar 02 Javascript
JavaScript中的执行环境和作用域链
Sep 04 Javascript
QRCode.js:基于JQuery的生成二维码JS库的使用
Jun 23 #jQuery
js实现城市级联菜单的2种方法
Jun 23 #Javascript
JS使用正则表达式验证身份证号码
Jun 23 #Javascript
创建简单的node服务器实例(分享)
Jun 23 #Javascript
详解微信小程序 template添加绑定事件
Jun 23 #Javascript
微信小程序 检查接口状态实例详解
Jun 23 #Javascript
20行JS代码实现网页刮刮乐效果
Jun 23 #Javascript
You might like
DEDE实现转跳属性文档在模板上调用出转跳地址
2016/11/04 PHP
PHP对象相关知识总结
2017/04/09 PHP
php自定义函数实现统计中文字符串长度的方法小结
2017/04/15 PHP
PHP实现链式操作的三种方法详解
2017/11/16 PHP
Laravel实现ApiToken认证请求
2019/10/14 PHP
prettify 代码高亮着色器google出品
2010/12/28 Javascript
用Javascript评估用户输入密码的强度(Knockout版)
2011/11/30 Javascript
js截取字符串的两种方法及区别详解
2013/11/05 Javascript
基于jquery实现等比缩放图片
2014/12/03 Javascript
JavaScript设计模式之外观模式介绍
2014/12/28 Javascript
使用AJAX实现Web页面进度条的实例分享
2016/05/06 Javascript
温习Javascript基础语法之词法结构
2016/05/31 Javascript
Node.js Addons翻译(C/C++扩展)
2016/06/12 Javascript
浅谈js多维数组和hash数组定义和使用
2016/07/27 Javascript
bootstrapValidator 重新启用提交按钮的方法
2017/02/20 Javascript
AngularJS表单验证功能分析
2017/05/26 Javascript
JavaScript设计模式之建造者模式实例教程
2018/07/02 Javascript
python3写爬取B站视频弹幕功能
2017/12/22 Python
Python2包含中文报错的解决方法
2018/07/09 Python
解决pycharm安装后代码区不能编辑的问题
2018/10/28 Python
Python3.4学习笔记之列表、数组操作示例
2019/03/01 Python
Python打包模块wheel的使用方法与将python包发布到PyPI的方法详解
2020/02/12 Python
k-means 聚类算法与Python实现代码
2020/06/01 Python
Python中的Cookie模块如何使用
2020/06/04 Python
python:HDF和CSV存储优劣对比分析
2020/06/08 Python
英国Office鞋店德国网站:在线购买鞋子、靴子和运动鞋
2018/12/19 全球购物
医学生自我鉴定范文
2014/03/26 职场文书
主题实践活动总结
2014/05/08 职场文书
大跃进口号
2014/06/16 职场文书
学校百日安全生产活动总结
2014/07/05 职场文书
2014年入党积极分子党校培训心得体会
2014/07/08 职场文书
2014新生大学四年计划书
2014/09/21 职场文书
群众路线自我剖析材料
2014/10/08 职场文书
php微信小程序解包过程实例详解
2021/03/31 PHP
golang goroutine顺序输出方式
2021/04/29 Golang
Java获取e.printStackTrace()打印的信息方式
2021/08/07 Java/Android