2016-05-18 22 views
0

私はAngularsJsの初心者です。コントローラの構造について質問があります。角度コントローラ構造

これは私のemployeeController.js

(function() 
    { 
     angular.module('employeeApp').controller('employeeController', employeeController); 

     function employeeController(employeeFactory,$routeParams,departmentFactory,schoolFactory,mentorFactory,constants,$location,$scope) { 
      var vm = this; 
      vm.employee = null; 
      vm.employees = null; 
      vm.profilePicture = null; 
      vm.mentors = null; 
      vm.schools = null; 
      vm.departments = null; 
      vm.roleId = constants.roleid; 
      vm.internEducators = null; 

      vm.overviewMentors = function() { 
       mentorFactory.overview(constants.companyid).then(function(response) 
       { 
        vm.mentors = response; 
       }); 
      } 

      vm.create = function() 
      { 
       employeeFactory.create(vm.employee,vm.profilePicture).success(function(response,status) 
       { 
        if(status == 200) 
        { 
         $.toaster({message: 'De werknemer is toegevoegd'}); 
         $location.path('/home'); 
        } 
        }).error(function(response) 
        { 
         var i = 0; 
         vm.error = response; 

         angular.forEach(response.result.message, function(error) 
         { 
          if(i <= 2) 
          { 
           $.toaster({ priority: 'danger', message: error}); 
          } 
          i++; 
         }); 
        }); 
      } 

      vm.overviewInternEducators = function() { 
       employeeFactory.overviewInternEducators(constants.companyid).then(function(response) 
       { 
        vm.internEducators = response; 
       }); 
      } 

      vm.overviewSchools = function() { 
       schoolFactory.overview(constants.companyid).then(function(response) 
       { 
        if(angular.isDefined(response[0].SchoolId)) 
        { 
         vm.schools = response; 
        } 
        else 
        { 
         console.log('leeg!'); 
        } 
       }); 
      } 

      vm.overviewDepartments = function() { 
       console.log('test'); 
       departmentFactory.overview(constants.companyid).then(function(response) 
       { 
        vm.departments = response; 
       }); 
      } 

      vm.show = function() { 
       vm.isAdmin = employeeFactory.isAdmin(); 
       employeeFactory.show($routeParams.id).then(function(response) 
       { 
        vm.employee = response; 
       }); 
      } 

      vm.showDeleted = function() { 
       employeeFactory.showDeleted($routeParams.id).then(function(response) 
       { 
        vm.employee = response; 
       }); 
      } 

      vm.update = function() 
      { 
       employeeFactory.update(vm.employee, vm.profilePicture).success(function(response, status) 
       { 
        if(status == 200) 
        { 
         vm.show(); // Zodat de nieuwe afbeelding wordt weergegeven 
         $.toaster({ message: 'De werknemer is geupdated' }); 
        } 
       }).error(function(response) 
       { 
        var i = 0; 
        vm.error = response; 

        angular.forEach(response.result.message, function(error) 
        { 
         if(i <= 2) 
         { 
          $.toaster({ priority: 'danger', message: error}); 
         } 
         i++; 
        }); 
       }); 
      } 

      vm.overviewDeleted = function() { 
       employeeFactory.overviewDeleted().then(function(response) 
       { 
        if(angular.isDefined(response[0].EmployeeId)) 
        { 
         vm.employees = response; 
        } 
       }); 
      } 

      vm.delete = function() { 
       employeeFactory.delete($routeParams.id).then(function(response) 
       { 
        if(response == 'true') 
        { 
         $.toaster({ message: 'De werknemer is verwijderd' }); 

         $location.path('/home'); 
        } 
        else 
        { 
         angular.forEach(response, function(error) 
         { 
          $.toaster({ priority: 'danger', message: error }); 
         }); 
        } 
       }); 

      } 

      vm.permanentDelete = function(employeeId) { 
       employeeFactory.permanentDelete(employeeId).then(function(response) 
       { 
        if(response == 'true') 
        { 
         $.toaster({ message: 'De werknemer is permanent verwijderd' }); 

         $location.path('/prullenbak/werknemers'); 
        } 
        else 
        { 
         angular.forEach(response, function(error) 
         { 
          $.toaster({ priority: 'danger', message: error }); 
         }); 
        } 
       }); 
      } 
     vm.restore = function(employeeId) { 
      employeeFactory.restore(employeeId).then(function(response) 
      { 
       if(response == 'true') 
       { 
        $.toaster({ message: 'De werknemer is teruggezet' }); 
        $location.path('/werknemer/' + employeeId); 
       } 
       else 
       { 
        if(angular.isArray(response)) 
        { 
         angular.forEach(response, function(error) 
         { 
          $.toaster({ priority : 'danger', message : error[0]}); 
         }); 
        } 
       } 
      }); 
     } 

     <!--ng-init--> 
     vm.editEmployee = function() 
     { 
      vm.show(); 
      vm.overviewDepartments(); 
      vm.overviewInternEducators(); 
      vm.overviewMentors(); 
      vm.overviewSchools(); 
     } 

     vm.createEmployee = function() { 
      vm.overviewMentors(); 
      vm.overviewSchools(); 
      vm.overviewDepartments(); 
      vm.overviewInternEducators(); 
     } 

     <!--redirects--> 
     vm.editRedirect = function(werknemerId) 
     { 
      $location.path('/werknemer/edit/' + werknemerId); 
     } 

     vm.showTrashedEmployeeRedirect = function(werknemerId) 
     { 
      $location.path('/prullenbak/werknemer/' + werknemerId); 
     } 
    } 
})() 

あなたは私がeditEmployeecreateEmployeeと呼ばれる2つの方法を使用して見ることができるように(最後に)。私はcreate employeeページとedit employee pageとこれら2を使用します。両方のページには、ロードする必要のあるコンボボックスがいくつかあります。たとえば私の従業員ページを作成する場合、私はng-init="employeeController.createEmployee()"と言って、それらのコンボボックスを埋めます。

私はこれが最良の方法ではないことを知っています。どうすれば違う方法でこれを行うことができますか?

+0

正確にあなたが助けをしたいです何@jamie感謝それはコンボボックスの読み込みですか、それともアプリケーションの「コントローラ」の全体構造ですか? –

+0

あなたの返信をありがとう、基本的にはコントローラの構造 – Jamie

+0

こんにちは。[John Papa Angular 1 style guide ](https://github.com/johnpapa/angular-styleguide/blob/master/a 1/README.md)、特に[コントローラセクション](https://github.com/johnpapa/angular-styleguide/blob/master/a1/README.md#controllers)を参照してください。 – Andrea

答えて

1

アプリを構造化する方法はいくつかありますが、Angularチームが承認したスタイルガイドはJohn Papaによって管理されています。 John PapaのAngular Style Guideを参照してください。その上で :

まず、私はあなたが別のcontrollerscreateshoweditdelete機能を分割することを示唆しています。これは、各コントローラを確保するのに役立ちますないだけ1 単一 thing.Thisは、それはあなたがあなたのコントローラにスコープを挿入する必要はありませんcontrollerAs構文を使用しているようですので、Single Responsibilityのアイデアと第二Separation of Concerns

に沿ったものです。ここで

は、従業員を作成するためのコードである(のようなSTH create-employee.controller.js

(function() { 
    'use strict'; 
    angular.module('employeeApp').controller('CreateEmployeeController', CreateEmployeeController); 
    //ngInject is used to help create minify safe version of the file during the build process. 
//You should have this somewhere in your build process 
/** @ngInject **/ 
function CreateEmployeeController(constants, departmentFactory, employeeFactory, $location, mentorFactory, schoolFactory) { 
var vm = this; 
vm.create = create; 
getMentors(); 
getSchools(); 
getDepartments(); 
getInternEducators(); 

function getMentors() { 
    return mentorFactory.overview(constants.companyid).then(function (response) { 
    vm.mentors = response; 
    }); 
} 

function getSchools() { 
    return schoolFactory.overview(constants.companyid).then(function (response) { 
    if (angular.isDefined(response[0].SchoolId)) { 
     vm.schools = response; 
    } 
    else { 
     console.log('leeg!'); 
    } 
    }); 
} 

function getDepartments() { 
    return departmentFactory.overview(constants.companyid).then(function (response) { 
    vm.departments = response; 
    }); 
} 

function getInternEducators() { 
    return employeeFactory.overviewInternEducators(constants.companyid).then(function (response) { 
    vm.internEducators = response; 
    }); 
} 
} 

function create() { 
return employeeFactory.create(vm.employee, vm.profilePicture).success(function (response, status) { 
    if (status == 200) { 
    $.toaster({message: 'De werknemer is toegevoegd'}); 
    $location.path('/home'); 
    } 
}).error(function (response) { 
    var i = 0; 
    vm.error = response; 

    angular.forEach(response.result.message, function (error) { 
    if (i <= 2) { 
     $.toaster({priority: 'danger', message: error}); 
    } 
    i++; 
    }); 
}); 
} 
})(); 

あなたは、この例で、次の機能を分割することにより、他のコントローラを作成します。

+0

ありがとうございました!非常に便利。 getMentors、getSchools、getDepartmentsのメソッドは、edit employeeでも使用されています。私はそれらのメソッドを複製するだけですか? – Jamie

+0

@Jamie、それは私が正直に分かっていないものです。 factory( 'myModule')。factory( '') 'を工場に持ち帰り、コントローラにそれらを取り込む、つまりコントローラにそれらを取り込むことに傾いています。もう1つの選択肢は、各コントローラーでそれらを繰り返すことですが、DRYの原則に反します(繰り返さないでください)。 これを掘り下げて回答します –

関連する問題