Angularjs - 工厂服务无法访问$ scope对象

问题描述 投票:0回答:2

根据问题的最佳答案:How to call custom Javascript functions from an AngularJS controller?

我试过以下代码:

<body ng-app="FDAApp" ng-controller="formController">
<form ng-submit="login()">
    <input type="submit" ng-click="ngSubmit()">
</form>
<script type="text/javascript" >
    var app = angular.module('FDAApp', []);
    angular.module('FDAApp').factory('MyService', function($http) {
        var sessionKey='';
        return {
            sessionKey: sessionKey,
            login: function()
            {
                sessionKey="ABCD";
            }
        }
    });

    app.controller('formController', function ($scope, $http, $templateCache, $interval, $timeout, MyService) {

        $scope.sessionKey = '';
        $scope.sessionKey = MyService.sessionKey;

        $scope.login = function () {
            MyService.login();
            console.log($scope.sessionKey);
        }
    });
</script>
</body>

问题:我无法获得$ scope.sessionKey的更新值。有帮助吗?

javascript angularjs factory
2个回答
0
投票

简单地颠倒你的设计:服务不应该改变任何$scope

相反,让服务更改自己的数据并公开对象引用:

angular.module('FDAApp').factory('MyService', function($http) {
    var session = {
        key: ''
    };

    return {
        session: session,
        login: function()
        {
            session.key = "ABCD";
        }
    }
});

app.controller('formController', function ($scope, $http, $templateCache, $interval, $timeout, MyService) {

    $scope.session = MyService.session;

    $scope.login = function () {
        MyService.login();
        console.log($scope.session.key);
    }
});

0
投票

当您更改基元而不是对象中的属性时,$ scope.sessionKey将保留旧会话密钥,新会话密钥是未跟踪的新实体。如果您希望以这种方式传播更改,则需要采用不同的策略。

您可以将$ scope传递给MyService以从服务中更改它,或者将MyService直接传递到范围中。

在范围内传递MyService:http://jsfiddle.net/3mrwLt65/

$scope.MyService = MyService

MyService.login()

// now $scope.MyService.sessionKey is your session key. 

$scope传递给MyService:

在控制器中:

MyService.login($scope);

在服务中,登录功能如下所示:

function(scope) {
   scope.sessionKey = <your session key>
}

你也可能想做this.sessionKey = 'ABCD'而不是sessionKey = 'ABCD'

© www.soinside.com 2019 - 2024. All rights reserved.