从子范围

时间:2016-12-31 12:30:49

标签: angularjs

我有两个控制器(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。我做错了什么?

2 个答案:

答案 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)

在ReportController中,'calculateStudentAge'函数是错误的。它应该接受参数并将其传递给服务。如下,

$scope.calculateStudentAge=function(dob){
    return StudentService.calculateAge(dob);
};