角度解决范围问题

时间:2015-08-05 15:35:16

标签: javascript angularjs

我是一名初级开发人员,并且一直在学习Angular.js的细节。我最近开始使用路由提供程序的resolve功能在页面加载之前从我的服务获取我的Project数据。在此之前,我在控制器内调用我的服务来获取数据。我的问题是,当我使用resolve时,数据很容易进入控制器,但我的范围并没有考虑代码底部的函数,我不太清楚为什么。如果我将函数声明移到顶部,它可以正常工作。我的猜测是,由于页面现在加载数据,它没有时间检查整个控制器,而是按顺序运行它。任何人都可以确认它的发生原因和解决方案,这样我可以保持代码的美观和可读性吗?感谢

我的路线提供者

.config(['$routeProvider', function ($routeProvider) {
    $routeProvider.when('/details/:id', {
        templateUrl: '/HtmlViews/Details.html',
        controller: 'detailController',
        resolve: {
            project: function (projectService, $rootScope, $route) {
                $rootScope.loading = true;
                return projectService.getProjectById($route.current.params.id);
            }
        }
    });
}])

我的控制器(仅限于重要的东西)在下面的状态中,程序在需要时无法在范围内找到函数getDateAt。

.controller('detailController', function ($scope, $http, $rootScope, projectService, project) {
    $rootScope.loading = false;
    $scope.id = project.ID;
    $scope.project = project;
    $scope.sprintCountRounded = projectService.roundSprintCount($scope.project.SprintCount, $scope.project.RoundUp);
    // Check and alter data depending on if a start date is present on the project
    $scope.isDateMissing = $scope.project.StartDate === undefined || $scope.project.StartDate === null;
    if (!$scope.isDateMissing) {

        $scope.startDate = $scope.getDateAt(0);
        $scope.finalSprintStart = $scope.getDateAt($scope.sprintCountRounded);
        $scope.finalSprintEnd = $scope.getDateAt($scope.sprintCountRounded + 1);
    }
    $scope.NumberOfLoggedSprints = $scope.project.Sprints.length;
    $scope.getDateAt = function (sprintNum) {
        return projectService.getDateAt(sprintNum, $scope.project.SprintDuration, $scope.project.StartDate);
    }

});

1 个答案:

答案 0 :(得分:0)

JavaScript处理代码'自上而下' (有点),可以说,因为它是一种解释性语言。因此,当您的代码逐行处理时,一旦它到达条件中具有$scope.getDateAt()的行,它就会尝试在您的范围对象上调用该函数。但问题在于:您的功能尚未定义,因为JavaScript尚未处理定义函数的行。

正如您所注意到的,通过将函数定义放在顶部,它可以完美地工作,因为该代码首先被处理。这通常在您声明内联函数时发生。

这个例外是显式函数定义。如果您要执行以下代码,无论您放置getDateAt()函数的位置如何,它都会起作用:

function getDateAt(sprintNum) {
    return projectService.getDateAt(sprintNum, $scope.project.SprintDuration, $scope.project.StartDate);
}