Home  >  Article  >  Web Front-end  >  How AngularJS implements Model caching_AngularJS

How AngularJS implements Model caching_AngularJS

WBOY
WBOYOriginal
2016-05-16 15:16:221316browse

How to implement a Model cache in AngularJS?

You can return a constructor in the Provider and design a cache field in the constructor. This approach will be introduced at the end of this article.

Generally speaking, Model should be assigned to a variable in Scope.

Some directly assign the object to the Scope variable; some return an object in the Provider and then assign it to the Scope variable; some return a constructor in the Provider and then assign it to the Scope variable. Let’s experience it one by one in this article.

First customize a directive to change the value of a scope variable by clicking a button.

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

■ Assign an object to the Scope variable

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

In page:

<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>

Above,

  • ● Changing the value of input in FirstCtrl only affects the variable user in FirstCtrl and does not affect the variable user in SecondCtrl
  • ● Clicking the button in FirstCtrl only affects the variable user in FirstCtrl
  • ● Changing the value of input in SecondCtrl only affects the variable user in SecondCtrl and does not affect the variable user in FirstCtrl
  • ● Clicking the button in SecondCtrl only affects the variable user in SecondCtrl

■ Return an object in Provider and assign it to Scope variable

 .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'
   }
  };
 })

In page:

<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>

Above,

  • ● Change the value of input in ThirdCtrl, and simultaneously affect the variables user in ThirdCtrl and FourthCtrl
  • ● Click the button in ThirdCtrl to affect the variables user in ThirdCtrl and FourthCtrl simultaneously
  • ● Change the value of input in FourthCtrl, and simultaneously affect the variables user in ThirdCtrl and FourthCtrl
  • ● Click the button in FourthCtrl to simultaneously affect the variables user in ThirdCtrl and FourthCtrl

■ Return a constructor in Provider and assign it to the Scope variable

 .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';
   }
  }
 })

In page:

<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>

Above,

  • ● Changing the value of input in FifthCtrl only affects the variable user in FifthCtrl and does not affect the variable user in SixthCtrl
  • ● Clicking the button in FifthCtrl only affects the variable user in FifthCtrl
  • ● Changing the value of input in SixthCtrl only affects the variable user in SixthCtrl and does not affect the variable user in FifthCtrl
  • ● Clicking the button in SixthCtrl only affects the variable user in SixthCtrl

■ Return a constructor in Provider with a cache field and assign it to the Scope variable

 .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;
  }];
 })

In page:

<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>

Above,

  • ● Change the value of input in SeventhCtrl, and simultaneously affect the variables user in SeventhCtrl and EighthCtrl
  • ● Click the button in SeventhCtrl to affect the variables user in SeventhCtrl and EighthCtrl simultaneously
  • ● Change the value of input in EighthCtrl, and simultaneously affect the variables user in SeventhCtrl and EighthCtrl
  • ● Click the button in EighthCtrl to affect the variables user in SeventhCtrl and EighthCtrl simultaneously

The above is the entire content of this article, I hope it will be helpful to everyone’s study.

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn