0

Plunkr

我在我的控制器中注入了这项服务。它只是一种共享某些属性的服务。

angular.module('app', []).
service('sharedProperties', function () {
    var list_name = '';

    return {
        getListName: function() {
            return list_name;
        },
        setListName: function(name) {
            list_name = name;
        }
    };
});

我有两个控制器。在第一个中,我设置了 list_name 的值。在我的第二个,我想重试这些信息。

这是我的控制器的定义方式:

function ListCtrl($scope, $http, sharedProperties) {
   ...
   $scope.changeListName = function(list_name) {
 sharedProperties.setListName(list_name);
 console.log(list_name, sharedProperties.getListName());    # shows ( 'metro', 'metro')  == metro being a dummy list_name
   ...
};

function ItemCtrl($scope, $http, sharedProperties) {
    ...
    $scope.showOnlyList = sharedProperties.getListName();
    console.log(this.sharedProperties.getListName());           # empty string
    ...
};

我记录了变量并在浏览器控制台中检查了它们,并注意到 ListCtrl 正确设置了共享属性。问题来自 ItemCtrl 控制器。似乎当我尝试使用 访问 list_name 时sharedProperties.getListName();,该属性为空,或者该函数返回一个空字符串。

更新

我以为问题出在服务上。所以我决定使用Lungojs 的数据库

我得到以下代码:

在 ListCtrl 中:

$scope.changeListName = function(list_name) {
        Lungo.Data.Cache.set("ListName", list_name);
        console.log('LIST', Lungo.Data.Cache.get("ListName"));
    };

在 ItemCtrl 中:

$scope.showOnlyList = Lungo.Data.Cache.get("ListName");
console.log('ITEM', Lungo.Data.Cache.get("ListName"));

ListCtrl 中的日志显示缓存设置为正确的 list_name。Lungo.Data.Cache.get("ListName")但是,即使在 ListCtrl 上它是正确的,ItemCtrl 的控制台也会显示它是未定义的!

我还尝试用 HTML5 本地存储替换缓存但没有成功...

4

1 回答 1

2

好吧,我认为这是因为您在实例化 ItemCtrl 之后立即将 sharedListPropery 记录到控制台。实例化时,sharedPropertyList 还没有值。

编辑:对不起,JSFiddle 目前不工作,所以我必须把这个未经测试的代码放在这里。但它应该给你一个想法

angular.module('app', []).
service('sharedProperties', function () {
  var list_name = '';

  return {
      getListName: function() {
          return list_name;
      },
      setListName: function(name) {
        list_name = name;
      }
  };
}).
controller('ListCtrl',['$scope','sharedProperties',function(scope,shared){
  console.log(shared.getListName()); //empty, because nothing set yet.
  scope.listname = shared.getListName();
  //watching the change and updating the shared
  scope.$watch('listname',function(value){
    console.log('listname is now '+value);
    shared.setListName(value); 
  })
  //watching the shared directly
  scope.shared=shared;
  scope.$watch('shared.getListName()',function(value){
      console.log("sharedProperty has changed to"+value);
  })

}]);
于 2013-07-05T15:15:11.310 回答