在Angular.js中更改视图时,处理$ scope状态和值的正确方法是什么

时间:2014-12-09 20:13:45

标签: javascript angularjs angularjs-scope

我是一名Java程序员。我现在正在使用JavaScript的移动应用程序中工作,特别是使用Angular.js。

我对这项技术完全陌生,所以我试图弄清楚当从一个视图切换到另一个共享同一控制器的视图时如何在控制器范围内保存值。

例如:这是我的UserController

.controller('UserCtrl',['$scope','UserService',function($scope, UserService) {

    UserService.getAll().success(function(data){
        $scope.items=data.results;
    });

    UserService.get("h7D2wy5lIs").then(function(data){
        $scope.item = data.data;
    });

    $scope.onItemDelete = function (item) {
        UserService.delete(item.objectId);
        $scope.items.splice($scope.items.indexOf(item),1);
    };
}])

此控制器在两个不同的视图之间共享。当我导航时,控制器每次都重新加载,我只需要从REST服务获取一次默认用户项,然后将其存储在控制器的范围内以便使用它。

如果我修改表单中的项属性,当我返回时,它会从REST API获取值,而不是使用我提供的新值保持状态。

有没有办法初始化一次Controller并通过导航保持其状态?

提前致谢。

1 个答案:

答案 0 :(得分:1)

最好的方法是使用服务在控制器之间共享数据,在您的情况下,更新UserService:

app.factory('userService', function() {
  var items = null;
  var defaultItem = null;
  return {
    getAll: function() {
      if (!items) {
        //get from REST service and set items
      }
      return items;
    },
    getDefaultItem: function(id) {
      if (!defaultItem) {
        //get from REST service and set defaultItem
      }
      return defaultItem;
    },
    ...
  };
});

另请注意,您可能需要使用$q的promises来处理异步调用。

或者你在$ rootScope而不是$ scope上设置冷却,但是你要求正确的方法:)