AngularJS实现Model缓存的方式
在AngularJS中如何实现一个Model的缓存呢?
可以通过在Provider中返回一个构造函数,并在构造函数中设计一个缓存字段,在本篇末尾将引出这种做法。
一般来说,Model要赋值给Scope的某个变量。
有的直接把对象赋值给Scope变量;有的在Provider中返回一个对象再赋值给Scope变量;有的在Provider中返回一个构造函数再赋值给Scope变量。本篇来一一体验。
首先自定义一个directive,用来点击按钮改变一个scope变量值。
angular .module('app',[]) .directive('updater',function(){ reutrn{ scope:{ user:'=' }, template:'<button>ChangeUser.datatowhaaaat?</button>', link:function(scope,element,attrs){ element.on('click',function(){ scope.user.data='whaaaat?'; scope.$apply(); }) } }
■给Scope变量赋值一个对象
.controller('FirstCtrl',function(){ varfirst=this; first.user={data:'cool'}; }) .controller('SecondCtrl',function(){ varsecond=this; second.user={data:'cool'}; })
页面中:
<divng-controller="FirstCtrl"> {{user.data}} <inputng-model="user.data"> <divupdateruser="user"></div> </div> <divng-controller="SecondCtrl"> {{user.data}} <inputng-model="user.data"> <divupdateruser="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){ varthird=this; third.user=User; }]) .controller('FourthCtrl',['User',function(User){ varfourth=this; fourth.user=User; }]) //provider返回对象 .provider('User',function(){ this.$get=function(){ return{ data:'cool' } }; })
页面中:
<divng-controller="ThirdCtrl"> {{user.data}} <inputng-model="user.data"> <divupdateruser="user"></div> </div> <divng-controller="FourthCtrl"> {{user.data}} <inputng-model="user.data"> <divupdateruser="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){ varfifth=this; fifth.user=newUserModel(); }]) .controller('SixthCtrl',['UserModel',function(UserModel){ varsixth=this; sixth.user=newUserModel(); }]) //provider返回构造函数,每一次构造,就生成一个实例 .provider('UserModel',function(){ this.$get=function(){ returnfunction(){ this.data='cool'; } } })
页面中:
<divng-controller="FifthCtrl"> {{user.data}} <inputng-model="user.data"> <divupdateruser="user"></div> </div> <divng-controller="SixthCtrl"> {{user.data}} <inputng-model="user.data"> <divupdateruser="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){ varseventh=this; seventh.user=newSmartUserModel(1); }]) .controller('EighthCtrl',['SmartUserModel',function(SmartUserModel){ vareighth=this; eighth.user=newSmartUserModel(1); }]) //provider返回构造函数,根据id获取,如果第一次就创建一个放缓存字段中,以后从缓存中获取 .provider('SmartUserModel',function(){ this.$get=['$timeout',function($timeout){ varUser=functionUser(id){ //先从缓存字段提取 if(User.cached[id]){ returnUser.cached[id]; } this.data='cool'; User.cached[id]=this; }; User.cached={}; returnUser; }]; })
页面中:
<divng-controller="SeventhCtrl"> {{user.data}} <inputng-model="user.data"> <divupdateruser="user"></div> </div> <divng-controller="EighthCtrl"> {{user.data}} <inputng-model="user.data"> <divupdateruser="user"></div> </div>
以上,
- ●改变SeventhCtrl中input的值,同时影响SeventhCtrl和EighthCtrl中的变量user
- ●点击SeventhCtrl中的按钮,同时影响SeventhCtrl和EighthCtrl中的变量user
- ●改变EighthCtrl中input的值,同时影响SeventhCtrl和EighthCtrl中的变量user
- ●点击EighthCtrl中的按钮,同时影响SeventhCtrl和EighthCtrl中的变量user
以上就是本文的全部内容,希望对大家的学习有所帮助。