我是一名初级开发人员,并且一直在学习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);
}
});
答案 0 :(得分:0)
JavaScript处理代码'自上而下' (有点),可以说,因为它是一种解释性语言。因此,当您的代码逐行处理时,一旦它到达条件中具有$scope.getDateAt()
的行,它就会尝试在您的范围对象上调用该函数。但问题在于:您的功能尚未定义,因为JavaScript尚未处理定义函数的行。
正如您所注意到的,通过将函数定义放在顶部,它可以完美地工作,因为该代码首先被处理。这通常在您声明内联函数时发生。
这个例外是显式函数定义。如果您要执行以下代码,无论您放置getDateAt()
函数的位置如何,它都会起作用:
function getDateAt(sprintNum) {
return projectService.getDateAt(sprintNum, $scope.project.SprintDuration, $scope.project.StartDate);
}