AngularJS实现Model缓存的方式


Posted in Javascript onFebruary 03, 2016

在AngularJS中如何实现一个Model的缓存呢?

可以通过在Provider中返回一个构造函数,并在构造函数中设计一个缓存字段,在本篇末尾将引出这种做法。

一般来说,Model要赋值给Scope的某个变量。

有的直接把对象赋值给Scope变量;有的在Provider中返回一个对象再赋值给Scope变量;有的在Provider中返回一个构造函数再赋值给Scope变量。本篇来一一体验。

首先自定义一个directive,用来点击按钮改变一个scope变量值。

angular
 .module('app',[])
 .directive('updater', function(){
  reutrn {
   scope: {
    user: '='
   },
   template: '<button>Change User.data to whaaaat?</button>',
   link: function(scope, element, attrs){
    element.on('click', function(){
     scope.user.data = 'whaaaat?';
     scope.$apply();
    })
   }
  }

■ 给Scope变量赋值一个对象

.controller('FirstCtrl', function(){
  var first = this;
  first.user = {data: 'cool'};
 })
 .controller('SecondCtrl', function(){
  var second = this;
  second.user = {data: 'cool'};
 })

页面中:

<div ng-controller="FirstCtrl">
 {{user.data}}
 <input ng-model="user.data">
 <div updater user="user"></div>
</div>

<div ng-controller="SecondCtrl">
 {{user.data}}
 <input ng-model="user.data">
 <div updater user="user"></div>
</div>

以上,

  • ● 改变FirstCtrl中input的值,仅仅影响FirstCtrl中的变量user,不影响SecondCtrl中的变量user
  • ● 点击FirstCtrl中的按钮,仅仅影响FirstCtrl中的变量user
  • ● 改变SecondCtrl中的input的值,仅仅影响SecondCtrl中的变量user,不影响FirstCtrl中的变量user
  • ● 点击SecondCtrl中的按钮,仅仅影响SecondCtrl中的变量user

■ 在Provider返回一个对象,赋值给Scope变量

.controller('ThirdCtrl',['User', function(User){
  var third = this;
  third.user = User;
 }])
 .controller('FourthCtrl', ['User',function(User){
  var fourth = this;
  fourth.user = User;
 }])
 //provider返回对象
 .provider('User', function(){
  this.$get = function(){
   return {
    data: 'cool'
   }
  };
 })

页面中:

<div ng-controller="ThirdCtrl">
 {{user.data}}
 <input ng-model="user.data">
 <div updater user="user"></div>
</div>

<div ng-controller="FourthCtrl">
 {{user.data}}
 <input ng-model="user.data">
 <div updater user="user"></div>
</div>

以上,

  • ● 改变ThirdCtrl中input的值,同时影响ThirdCtrl和FourthCtrl中的变量user
  • ● 点击ThirdCtrl中的按钮,同时影响ThirdCtrl和FourthCtrl中的变量user
  • ● 改变FourthCtrl中input的值,同时影响ThirdCtrl和FourthCtrl中的变量user
  • ● 点击FourthCtrl中的按钮,同时影响ThirdCtrl和FourthCtrl中的变量user

■ 在Provider中返回一个构造函数,赋值给Scope变量

.controller('FifthCtrl',['UserModel', function(UserModel){
  var fifth = this;
  fifth.user = new UserModel();
 }])
 .controller('SixthCtrl',['UserModel', function(UserModel){
  var sixth = this;
  sixth.user = new UserModel();
 }])
 //provider返回构造函数,每一次构造,就生成一个实例
 .provider('UserModel', function(){
  this.$get = function(){
   return function(){
    this.data = 'cool';
   }
  }
 })

页面中:

<div ng-controller="FifthCtrl">
 {{user.data}}
 <input ng-model="user.data">
 <div updater user="user"></div>
</div>

<div ng-controller="SixthCtrl">
 {{user.data}}
 <input ng-model="user.data">
 <div updater user="user"></div>
</div>

以上,

  • ● 改变FifthCtrl中input的值,仅仅影响FifthCtrl中的变量user,不影响SixthCtrl中的变量user
  • ● 点击FifthCtrl中的按钮,仅仅影响FifthCtrl中的变量user
  • ● 改变SixthCtrl中的input的值,仅仅影响SixthCtrl中的变量user,不影响FifthCtrl中的变量user
  • ● 点击SixthCtrl中的按钮,仅仅影响SixthCtrl中的变量user

■ 在Provider中返回一个构造函数,带缓存字段,赋值给Scope变量

.controller('SeventhCtrl',['SmartUserModel', function(SmartUserModel){
  var seventh = this;
  seventh.user = new SmartUserModel(1);
 }])
 .controller('EighthCtrl',['SmartUserModel', function(SmartUserModel){
  var eighth = this;
  eighth.user = new SmartUserModel(1);
 }])
 //provider返回构造函数,根据id获取,如果第一次就创建一个放缓存字段中,以后从缓存中获取
 .provider('SmartUserModel', function(){
  this.$get = ['$timeout', function($timeout){
   var User = function User(id){
    //先从缓存字段提取
    if(User.cached[id]){
     return User.cached[id];
    }
    this.data = 'cool';
    User.cached[id] = this;
   };
   
   User.cached = {};
   return User;
  }];
 })

页面中:

<div ng-controller="SeventhCtrl">
 {{user.data}}
 <input ng-model="user.data">
 <div updater user="user"></div>
</div>

<div ng-controller="EighthCtrl">
 {{user.data}}
 <input ng-model="user.data">
 <div updater user="user"></div>
</div>

以上,

  • ● 改变SeventhCtrl中input的值,同时影响SeventhCtrl和EighthCtrl中的变量user
  • ● 点击SeventhCtrl中的按钮,同时影响SeventhCtrl和EighthCtrl中的变量user
  • ● 改变EighthCtrl中input的值,同时影响SeventhCtrl和EighthCtrl中的变量user
  • ● 点击EighthCtrl中的按钮,同时影响SeventhCtrl和EighthCtrl中的变量user

以上就是本文的全部内容,希望对大家的学习有所帮助。

Javascript 相关文章推荐
帮助避免错误的Javascript陷阱清单
May 31 Javascript
Google AJAX 搜索 API实现代码
Nov 17 Javascript
关闭浏览器时提示onbeforeunload事件
Dec 25 Javascript
js实现选中页面文字将其分享到新浪微博
Nov 05 Javascript
JavaScript实现仿淘宝商品购买数量的增减效果
Jan 22 Javascript
常用原生JS兼容性写法汇总
Apr 27 Javascript
Bootstrap3使用typeahead插件实现自动补全功能
Jul 07 Javascript
JS取数字小数点后两位或n位的简单方法
Oct 24 Javascript
使用JS实现图片轮播的实例(前后首尾相接)
Sep 21 Javascript
微信小程序实现倒计时调用相机自动拍照功能
Jun 10 Javascript
antd design table更改某行数据的样式操作
Oct 31 Javascript
JavaScript实现网页下拉菜单效果
Nov 20 Javascript
JS实现CheckBox复选框全选、不选或全不选功能
Jul 28 #Javascript
javascript实现在网页中运行本地程序的方法
Feb 03 #Javascript
简单实现js选项卡切换效果
Feb 03 #Javascript
Eclipse编辑jsp、js文件时卡死现象的解决办法汇总
Feb 02 #Javascript
JavaScript+html5 canvas实现本地截图教程
Apr 16 #Javascript
javascript自定义滚动条实现代码
Apr 20 #Javascript
JavaScript File API实现文件上传预览
Feb 02 #Javascript
You might like
PHP5.3.1 不再支持ISAPI
2010/01/08 PHP
ajax php传递和接收变量实现思路及代码
2012/12/19 PHP
作为PHP程序员应该了解MongoDB的五件事
2013/06/03 PHP
Yii框架连接mongodb数据库的代码
2016/07/27 PHP
php导出csv文件,可导出前导0实例代码
2016/11/16 PHP
javaScript 删除字符串空格多种方法小结
2012/10/24 Javascript
jquery调取json数据实现省市级联的方法
2015/01/29 Javascript
JS弹出可拖拽可关闭的div层完整实例
2015/02/13 Javascript
jQuery操作基本控件方法实例分析
2015/12/31 Javascript
Angular ui.bootstrap.pagination分页
2017/01/20 Javascript
js CSS3实现卡牌旋转切换效果
2017/07/04 Javascript
JS实现分页浏览横向图片(类轮播)实例代码
2017/11/06 Javascript
jQuery实现炫丽的3d旋转星空效果
2018/07/04 jQuery
Vue如何实现响应式系统
2018/07/11 Javascript
解决layui数据表格Date日期格式的回显Object的问题
2019/09/19 Javascript
JavaScript进制转换实现方法解析
2020/01/18 Javascript
Python基础之函数用法实例详解
2014/09/10 Python
python中将函数赋值给变量时需要注意的一些问题
2017/08/18 Python
浅谈flask截获所有访问及before/after_request修饰器
2018/01/18 Python
使用python3+xlrd解析Excel的实例
2018/05/04 Python
浅谈numpy生成数组的零值问题
2018/11/12 Python
python实现tail实时查看服务器日志示例
2019/12/24 Python
python给指定csv表格中的联系人群发邮件(带附件的邮件)
2019/12/31 Python
使用python+poco+夜神模拟器进行自动化测试实例
2020/04/23 Python
使用sklearn对多分类的每个类别进行指标评价操作
2020/06/11 Python
python中count函数知识点浅析
2020/12/17 Python
Windows和Linux动态库应用异同
2016/07/28 面试题
机电专业大学生求职信
2013/10/04 职场文书
应届大学生求职的自我评价
2013/11/17 职场文书
小学生常见病防治方案
2014/06/06 职场文书
体育运动口号
2014/06/09 职场文书
人力资源管理毕业生自荐信
2014/06/26 职场文书
2014年安全管理工作总结
2014/12/01 职场文书
向女朋友道歉的话
2015/01/20 职场文书
小学数学新课改心得体会
2016/01/22 职场文书
MySQL 1130异常,无法远程登录解决方案详解
2021/08/23 MySQL