Angular:无法使用服务访问控制器中的变量

时间:2016-06-22 12:57:40

标签: javascript angularjs dependency-injection angularjs-controller

我正在尝试在控制器和函数之间共享变量。但我收到控制器的错误,说:

TypeError: Cannot read property 'getSet' of undefined 

我经历了很多教程,但不知道我哪里出错了。 我的服务代码是这样的:

app.service('shareData', function() {

    var selected = ["plz", "print", "something"];

    var putSet = function(set) {
        selected = set;
    };

    var getSet = function() {
        return selected;
    };

    return {
        putSet: putSet,
        getSet: getSet
    };
});   

我可以从我定义的函数中找到selected

setDisplay = function($scope, $mdDialog, shareData) {

    console.log(shareData.getSet()); // this is working

    $scope.selected = shareData.getSet();
    $scope.hide = function() {
        $mdDialog.hide();
    };
    $scope.cancel = function() {
        $mdDialog.cancel();
    };
    $scope.answer = function(answer) {
        $mdDialog.hide(answer);
    };
};

我的控制器是这样的:

app.controller('topicController', ['$scope', '$http', '$mdDialog', 'shareData',
function ($scope, $http, $mdDialog, $mdToast, shareData) {

    console.log(shareData.getSet()); // NOT WORKING

}]); 

1 个答案:

答案 0 :(得分:4)

您的$mdToast控制器的工厂功能中有额外topicController,您需要将其删除。

背后的原因是工作不正常,目前你在['$scope', '$http', '$mdDialog', 'shareData', function&数组等数组中提到了4个依赖项。然后你在DI数组旁边的函数中使用它的实例。在该函数中,您实际上有5个依赖项,其中$mdToast是额外的。所以在幕后发生的事情是$scope函数保持'$scope' DI数组的值,同样你从右到左。但是当谈到$mdToast(在控制器函数中)时,它保持'shareData'(DI数组)的值和&那么下一个参数shareData什么都没有。

app.controller('topicController', ['$scope', '$http', '$mdDialog', 'shareData', 
      function ($scope, $http, $mdDialog, shareData) { //<--removed $mdToast
    console.log(shareData.getSet());
  }
]);
  

注意:您正在使用DI inline array annotation,所以依赖项在数组中注入的顺序,您应该以相同的顺序   然后注入基础工厂功能。