无法读取 Angularjs 1.6.6 中未定义的 属性 'length'
Cannot read property 'length' of undefined in Angularjs 1.6.6
我必须下拉列表并希望根据第一个列表中的选定值填充第二个列表。我在填充第一个列表时遇到问题。我使用课程服务的 getCurrentSessionCourses() 方法从服务器获取数据并从该数据填充第一个列表。第一个列表填充在 for 循环中。如果 for 循环在服务器响应之前执行,则 i < $scope.Courses.length 具有未定义的值。 有时数据在for循环执行前就来了,有时数据在for循环执行后才来。下面是我的 AddStudentController.js 和相关的 HTML
(function(){
var myApp = angular.module("myApp");
var AddStudentController = function ($scope,StudentService,CourseService) {
var onCourses = function (data) {
var result = [];
for (var i = 0; i < $scope.Courses.length; i++) {
for (var j = 0; j < data.length; j++) {
if (data[j].IdCourse === $scope.Courses[i].idCourse) {
if (result.indexOf(data[j]) === -1) {
result.push(data[j]);
}
}
}
}
$scope.courses = result;
$scope.selectedCourse = result[0];
var IdCourse = $scope.selectedCourse.IdCourse;
var IdSessionCourse = null;
for (var i = 0; i < $scope.Courses.length; i++) {
if ($scope.Courses[i].idCourse === IdCourse) {
IdSessionCourse = $scope.Courses[i].idSessionCourse;
}
};
CourseService.getCourseClasses(IdSessionCourse).then(function (classes) {
$scope.classes = classes;
$scope.selectedClass = classes[0];
});
CourseService.getCurrentSessionCourses().then(function (courses) { $scope.Courses = courses });
CourseService.courses().then(onCourses);
};
myApp.controller("AddStudentController", AddStudentController)
}());
////Below is CourseService.js
(function () {
var CourseService = function ($http) {
var urlBase = 'api/CoursesAPI';
var getCurrentSessionCourses = function () {
return $http.get("api/CoursesAPI/GetCurrentSessionCourses")
.then(function (response) {
return response.data;
});
return {
getCurrentSessionCourses: getCurrentSessionCourses,
};
};
var module = angular.module("myApp");
module.factory("CourseService", CourseService);
}());
<div class="col-lg-5">
<div class="form-group">
<label>Select Course</label>
<select ng-model="selectedCourse" ng-change="change()" class="formcontrol"
ng-options="course.IdCourse as course.Name for course in courses">
</select>
</div>
</div>
<div class="col-lg-5">
<div class="form-group">
<label>Select Class</label>
<select ng-model="selectedClass" class="form-control" ng-options="class.idClass as class.className +' : '+class.campusName for class in classes"></select>
</div>
</div>
尝试在 CourseService.getCurrentSessionCourses()
之后以这种方式调用 CourseService.courses()
:
CourseService.getCurrentSessionCourses().then(function (courses) {
$scope.Courses = courses;
CourseService.courses().then(onCourses);
});
通过这种方式,您可以确保 $scope.Courses
在您尝试对其进行迭代时具有一定的价值。
尝试初始化$scope.Courses = []
。
当 angular 呈现页面时,它将找不到任何 $scope.Courses
对象,直到您将响应分配给 $scope.Courses
,从而抛出
$scope.Courses.length has undefined value
var myApp = angular.module("myApp");
$scope.Courses = []; // Add this line
var AddStudentController = function ($scope,StudentService,CourseService) {
var onCourses = function (data) {
...
我必须下拉列表并希望根据第一个列表中的选定值填充第二个列表。我在填充第一个列表时遇到问题。我使用课程服务的 getCurrentSessionCourses() 方法从服务器获取数据并从该数据填充第一个列表。第一个列表填充在 for 循环中。如果 for 循环在服务器响应之前执行,则 i < $scope.Courses.length 具有未定义的值。 有时数据在for循环执行前就来了,有时数据在for循环执行后才来。下面是我的 AddStudentController.js 和相关的 HTML
(function(){
var myApp = angular.module("myApp");
var AddStudentController = function ($scope,StudentService,CourseService) {
var onCourses = function (data) {
var result = [];
for (var i = 0; i < $scope.Courses.length; i++) {
for (var j = 0; j < data.length; j++) {
if (data[j].IdCourse === $scope.Courses[i].idCourse) {
if (result.indexOf(data[j]) === -1) {
result.push(data[j]);
}
}
}
}
$scope.courses = result;
$scope.selectedCourse = result[0];
var IdCourse = $scope.selectedCourse.IdCourse;
var IdSessionCourse = null;
for (var i = 0; i < $scope.Courses.length; i++) {
if ($scope.Courses[i].idCourse === IdCourse) {
IdSessionCourse = $scope.Courses[i].idSessionCourse;
}
};
CourseService.getCourseClasses(IdSessionCourse).then(function (classes) {
$scope.classes = classes;
$scope.selectedClass = classes[0];
});
CourseService.getCurrentSessionCourses().then(function (courses) { $scope.Courses = courses });
CourseService.courses().then(onCourses);
};
myApp.controller("AddStudentController", AddStudentController)
}());
////Below is CourseService.js
(function () {
var CourseService = function ($http) {
var urlBase = 'api/CoursesAPI';
var getCurrentSessionCourses = function () {
return $http.get("api/CoursesAPI/GetCurrentSessionCourses")
.then(function (response) {
return response.data;
});
return {
getCurrentSessionCourses: getCurrentSessionCourses,
};
};
var module = angular.module("myApp");
module.factory("CourseService", CourseService);
}());
<div class="col-lg-5">
<div class="form-group">
<label>Select Course</label>
<select ng-model="selectedCourse" ng-change="change()" class="formcontrol"
ng-options="course.IdCourse as course.Name for course in courses">
</select>
</div>
</div>
<div class="col-lg-5">
<div class="form-group">
<label>Select Class</label>
<select ng-model="selectedClass" class="form-control" ng-options="class.idClass as class.className +' : '+class.campusName for class in classes"></select>
</div>
</div>
尝试在 CourseService.getCurrentSessionCourses()
之后以这种方式调用 CourseService.courses()
:
CourseService.getCurrentSessionCourses().then(function (courses) {
$scope.Courses = courses;
CourseService.courses().then(onCourses);
});
通过这种方式,您可以确保 $scope.Courses
在您尝试对其进行迭代时具有一定的价值。
尝试初始化$scope.Courses = []
。
当 angular 呈现页面时,它将找不到任何 $scope.Courses
对象,直到您将响应分配给 $scope.Courses
,从而抛出
$scope.Courses.length has undefined value
var myApp = angular.module("myApp");
$scope.Courses = []; // Add this line
var AddStudentController = function ($scope,StudentService,CourseService) {
var onCourses = function (data) {
...