我有两个控制器(RegistrationController,ReportController)和一个工厂(StudentService)。 StudentService有一个计算年龄的方法,它将日期作为参数。
它还有一个学生名单。
在RegistrationController中有两种方法,calculateage调用工厂方法并传递从表单中获取的日期。第二种方法将学生添加到工厂列表中。这可以按预期工作。
在reportcontroller中,另一个列表从工厂的学生列表中填充。 这显示在表格中。 reportcontroller还有一个方法计算,它为每个学生调用工厂方法。但在这里我无法将日期传递给工厂方法。那么如何在reportcontroller方法中发送日期呢?该表格使用学生列表中的ng-repeat填充。
工厂是:
app.factory("StudentService",function(){
var factory={};
factory.calculateAge=function(dob){
return age;
}
factory.studentList=[];
return factory;
})
这个RegistrationController:
app.controller("RegistrationController",function($scope,StudentService){
$scope.registrationForm.addStudent=function(){
$scope.student={name:$scope.registrationForm.name,dateOfBirth:$scope.registrationForm.dateOfBirth};
StudentService.studentList.push($scope.student);
};
$scope.calculateStudentAge=function(age){
$scope.age=StudentService.calculateAge($scope.registrationForm.dateOfBirth);
};
});
ReportController:
app.controller("ReportController",function($scope,StudentService){
$scope.studentList=StudentService.studentList;
$scope.calculateStudentAge=function(){
return StudentService.calculateAge($scope.student.dateOfBirth);
};
});
学生表://编辑 - 这是在reportcontroller里面
<tr ng-repeat="student in studentList" ng-model="$parent.student">
<td>{{student.name}}</td>
<td>{{calculateStudentAge(student.dateOfBirth)}}</td>
</tr>
我尝试在reportController的calculateAge中传递$ scope.student.dateOfBirth,但它给出了错误,因为无法读取未定义的属性dateOfBirth。我做错了什么?
答案 0 :(得分:1)
使用过滤器:
app.filter('age', ['StudentService', function(studentService) {
return function(input) {
return studentService.calculateAge(input);
};
}])
注意:这是一个非常简化的版本,显示了基本用法,我建议你进行类型检查和其他验证,以确保你正在使用正确的输入。
所以行看起来像:
<tr ng-repeat="student in studentList" ng-model="$parent.student">
<td>{{student.name}}</td>
<td>{{ student.dateOfBirth | age }}</td>
</tr>
您不会将视图中的值推送到控制器(显示它们时),您应该将其视为单向事物。您可以从服务中获取值,只需将它们通过控制器传递给视图。
控制器只是视图绑定到并具有代码表示的东西。因为javascript控制着视图的进出,所以它需要一个JavaScript表示视图,a.k.a控制器。控制器将您用JavaScript编写的整个业务/视图逻辑绑定到您的视图。
总而言之,让您的数据准确地查看您在服务中的需求,然后将其直接传递到控制器上以便在视图中显示。
答案 1 :(得分:1)
$scope.calculateStudentAge=function(dob){
return StudentService.calculateAge(dob);
};