javascript - AngularJS 中的变量缓存(工厂)

标签 javascript angularjs

我的应用程序中有以下 Controller ,但有一些我无法解释的奇怪行为。我对其中两行进行了编号以帮助描述,它们不会同时存在于实时代码中。

var app = angular.module('movieListings', ['ngResource', 'ngRoute', 'ui.bootstrap', 'ng']);

var cachedMovieList = []; 

//Controller for movie list
app.controller('MovieListController', ['$http', function($http){
    var mlc = this; //needed for the $http request
    this.movies = cachedMovieList;    
    this.loaded = false;
    this.error = false;


    if(this.movies.length == 0) {            
        console.log("Grabbing new movie list from DB");
        $http.get('data/movies.json').success(function(data){
            mlc.movies = data; 
            mlc.loaded = true;
            cachedMovieList = data; //(1)
        }).error(function(data){
            mlc.error = true;
        });
        cachedMovieList = this.movies; //(2)
    } else {
        this.loaded = true;        
    }
}]);

使用上面的代码(第(1)行存在而第(2)行不存在),我能够缓存结果,这样当我在页面之间滑动时,我不需要不断地重新获取数据。

但是,如果我删除第 (1) 行并插入第 (2) 行,则变量“cachedMovieList”永远不会被填充。我希望它是基于“mlc.movi​​es”被分配给...的事实,但我无法理解为什么会出现这种情况?

欢迎任何建议。

最佳答案

实现一个检索数据的工厂。当数据从 $http 调用返回时,使用 angular.copy 保留数组引用。

 var app = angular.module('movieListings', ['ngResource', 'ngRoute', 'ui.bootstrap', 'ng']);
 app.factory('movies', function($http) {
     var movies = {
         data: [],
         loaded: false,
         error: false
     };

     $http.get('data/movies.json').success(function(data){
        angular.copy(data, movies.data); 
           movies.loaded = true;
        }).error(function(data){
           movies.error = true;
        });
     return movies;

 });

将工厂注入(inject) Controller :

//Controller for movie list
app.controller('MovieListController', ['$scope','movies', function($scope, movies){
     this.movies = movies;
}]);

工厂(如服务)是单例的。它们初始化一次,并在 SPA 的整个生命周期内缓存。

在 View 中使用 Controller :

 <div ng-controller="MovieListController as ctrl">
       <div ng-show="!ctrl.movies.loaded"> Loading... </div>
       <ul>
            <li ng-repeat="movie in ctrl.movies.data">
                {{ movie.name }}
            </li>
       </ul>
 </div>

关于javascript - AngularJS 中的变量缓存(工厂),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24387420/

相关文章:

javascript - 使用 JavaScript 增加行数?

javascript - 将表单输入更改为仅在复制元素时读取

javascript - 范围函数 Angular 右集

AngularJS:在指令中使用服务

javascript - Angularjs 选择选项设置为第一项不起作用

javascript - 在 ng-options 中将 C# dateTime 格式化为 AngularJS 日期

javascript - 递归返回对象数组和嵌套对象键

javascript - json.js 和 json2.js 有什么用?

angularjs - 如何一起使用 ng-polymer-elements 、 angularjs 和 requirejs?

javascript - Angularjs 在 Controller 之间共享方法