Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript AngularJS中有全局函数吗?[见守则]_Javascript_Angularjs_Angularjs Scope_Single Page Application - Fatal编程技术网

Javascript AngularJS中有全局函数吗?[见守则]

Javascript AngularJS中有全局函数吗?[见守则],javascript,angularjs,angularjs-scope,single-page-application,Javascript,Angularjs,Angularjs Scope,Single Page Application,我们最终决定在工作中使用AngularJS,我被要求开发一个小原型,看看AngularJS能做什么 我们有一个gradeController.js文件,其中包含以下代码: var gradeControllers = angular.module('gradeControllers', []); gradeControllers.controller('GradeListController', ['$scope', '$http', function ($scope, $http)

我们最终决定在工作中使用AngularJS,我被要求开发一个小原型,看看AngularJS能做什么

我们有一个gradeController.js文件,其中包含以下代码:

var gradeControllers = angular.module('gradeControllers', []);

gradeControllers.controller('GradeListController', ['$scope', '$http',
    function ($scope, $http) {
        $http({
            method: 'GET',
            url: '/api/grades',
            params: {
                skip: 0,
                take: 1000
            }
        }).success(function (data) {
            $scope.grades = data.splice(0, 150);
            $(".loader").hide();
        });

        $scope.saveChanges = function (grade) {
            alert("SAVING CHANGES...");
            $scope.gradeValue = grade.gradeValue;
            $scope.comment = grade.comment;
            $http({
                method: 'PUT',
                url: '/api/grades',
                params: {
                    id: grade.gradeId,
                    gradeValue: grade.gradeValue
                }
            }).success(function () {
                window.location.href = "#/grades";
            }).fail(function () {
                alert('FAIL');
            });
        };

    $scope.orderProp = 'dateModified';
}]);

gradeControllers.controller('GradeDetailController', ['$scope', '$routeParams', '$http',
    function($scope, $routeParams, $http) {
        $http({
            method: 'GET',
            url: '/api/grades/' + $routeParams.gradeId,
        }).success(function (data) {
            $scope.grade = data;
            $("form").show();
            $(".loader").hide();
        });

        $scope.saveChanges = function (grade) {
            $scope.gradeValue = grade.gradeValue;
            $scope.comment = grade.comment;
            $http({
                method: 'PUT',
                url: '/api/grades',
                params: {
                    id: grade.gradeId,
                    gradeValue: grade.gradeValue
                }
            }).success(function () {
                window.location.href = "#/grades";
            }).fail(function() {
                alert('FAIL');
            });
        };
    }
]);
现在,正如您所看到的,我们在两个控制器中都复制了
saveChanges()
函数,这正是困扰我们的地方

在定义模块时,是否可以几乎插入
$scope
$http
,并将
saveChanges()
函数置于控制器之外?如下所示:

var gradeControllers = angular.module('gradeControllers', ['$scope', '$http']);

$scope.saveChanges = function (grade) {
    $scope.gradeValue = grade.gradeValue;
    $scope.comment = grade.comment;
    $http({
        method: 'PUT',
        url: '/api/grades',
        params: {
            id: grade.gradeId,
            gradeValue: grade.gradeValue
        }
    }).success(function () {
        window.location.href = "#/grades";
    }).fail(function () {
        alert('FAIL');
    });
};

gradeControllers.controller('GradeListController', [,
    function ($scope, $http) {
        $http({
            method: 'GET',
            url: '/api/grades',
            params: {
                skip: 0,
                take: 1000
            }
        }).success(function (data) {
            $scope.grades = data.splice(0, 150);
            $(".loader").hide();
        });

        $scope.saveChanges();

    $scope.orderProp = 'dateModified';
}]);

gradeControllers.controller('GradeDetailController', ['$routeParams',
    function($scope, $routeParams, $http) {
        $http({
            method: 'GET',
            url: '/api/grades/' + $routeParams.gradeId,
        }).success(function (data) {
            $scope.grade = data;
            $("form").show();
            $(".loader").hide();
        });

        $scope.saveChanges();

    }
]);
我们通常通过使用调用
saveChanges()

所以我相信(我希望)如果我们把
saveChanges()
放在控制器之外,它仍然会知道作用域是什么


如果您需要任何澄清,请让我知道,我希望比我更有经验的人能够帮助我们解决这个问题

看看
服务
-我想说这就是您想要的。()

一个选择是创建自己的服务

app.service('util', ['$http', [function () {
 this.util = {
    _saveChanges = function (scope, grade) {
            scope.gradeValue = grade.gradeValue;
            scope.comment = grade.comment;
            $http({
                method: 'PUT',
                url: '/api/grades',
                params: {
                    id: grade.gradeId,
                    gradeValue: grade.gradeValue
                }
            }).success(function () {
                window.location.href = "#/grades";
            }).fail(function() {
                alert('FAIL');
            });
        }
    }

    var self = this.util;
    return {
        saveChanges: this.util._saveChanges
    }
}]);
您可以将此服务包括到您的控制器中

var gradeControllers = angular.module('gradeControllers', ['$scope', '$http', 'util']);
gradeControllers.controller('GradeListController', [,
    function ($scope, $http, util) {
        $scope.saveChanges = util.saveChanges;
        ...
    }]);
电话将会是

$scope.saveChanges($scope, grade)

在你通过当前$scope和grade的地方

看看
服务
——我想这就是你要找的。()您不应该在save方法中触及$scope,然后您可以将该方法模式化为服务。只需查看服务即可。我认为你们是对的——他们似乎正是我们所需要的@ThorJacobsen你介意写下你的评论作为回答,这样我就可以选择它作为正确的答案吗?除非有人有其他想法/建议?请随意接受或等待更多评论:)这正是我要做的;)我会再等几分钟,给其他人一个机会,但你似乎知道你在说什么,所以没有理由我不能接受:)谢谢你@ThorJacobsen(顺便问一下,你有什么超能力吗?:P)谢谢你的意见@Alex如果我采取上述方法,我必须在哪里定义服务?是否仍在gradeController.js文件中?或者在单独的文件中?最好有单独的文件。感谢您的帮助@Alex您需要将此文件包括在“index.html”文件(或任何称为基本html页面的文件)中,就像您为控制器所做的一样。