2016-08-12 1 views
3

우리는 하나의 엔터프라이즈 응용 프로그램을 개발했습니다. 완전한 클라이언트 측 프레임 워크는 AngularJS를 기반으로하며 서버 측 프레임 워크는 ASP.NET 웹 API에 있습니다. 이 애플리케이션에는 350 개 이상의 html 페이지와 250 개 이상의 웹 API가 있습니다. ng-init 지시어에서 서버 데이터를 호출하는 컨트롤러 기능을 통해 초기화하는 영역이 많이 있습니다. 우리의 응용 프로그램에서 모든 데이터가 ASP.NET 웹 API에서 나오기 때문에. 그러나 ng-init에 대한 설명은 다음과 같습니다.각도 컨트롤러 기능 호출을 통해 ng-init 지시문에서 서버 데이터를 초기화 하시겠습니까?

아래의 데모에서와 같이 ngRepeat의 별칭 속성에 대한 ngInit의 적절한 사용 방법. 이 경우 외에 ngInit 대신 컨트롤러를 사용하여 범위의 값을 초기화해야합니다.

필자는 업계 전문가/Angularjs 핵심 팀 구성원으로부터 내 의견에 대한 의견을 듣고 싶습니다.

우리가 업계의 HTML 페이지를로드하고 서버 데이터를 표시하는 산업 목록을 표시하기 위해 먼저 애플리케이션에서 수행중인 것을 간략하게 설명합니다. HTML 템플릿 코드는 다음과 같습니다.

<div ng-init="initIndustries()">....</div> 

"initIndustries"함수는 초기화 된 industryCtrl에서 호출됩니다. industryCtrl.js 코드는 다음과 같습니다 : 아래에 언급되어 Angularjs DocAnglarjs-styleguide guideline on Keep Controller Focused에 따라

app.controller("industryCtrl",["$scope",function($scope){ 

//Sets the server data in the $scope property. 
$scope.initIndustries = function(){ 
//perform ajax request and set the data into the $scope property. 
} 

$scope.initAddIndustry = function(){ 
// perform ajax request for getting a dropdown data on Add Industry Page. 
} 
}]) 

내가 가지고있는 몇 가지 문제를 :

  1. 우리는 모든 데이터가 있기 때문에 기능을 통해 데이터를 초기화 할 수 뭔가 잘못하고 있습니까 서버 API에서 오는?
  2. 현재 초기화 방법은 AngularJS 기반 응용 프로그램의 업계 관례에 위배됩니다. 그렇다면 어떤 접근 방식을 적용해야합니까?
  3. anglejs-styleguide에 따라 클라이언트 측 테스트 커버리지를 흔들기 위해서 모든 뷰에 대해 적절한 컨트롤러를 만들어야합니까?

위의 접근 방식을 (ng를-초기화 지시자를 통해 컨트롤러 기능의 데이터를 초기화), 구현하는 이유 때문에 많은 응용 프로그램에 내 초기 생각은 우려의 코드와 분리 디커플링의 MVC 철학을 따르도록했다.

답변

0

각도는 Model-View-Whatever로 알려져 있습니다. 따라서 각도 어플리케이션의 구조를 따르 든 그렇지 않든 완전히 당신에 달려 있습니다.

구조를 따르지 않으면 장단점이 있습니다.

장점 1. 한 컨트롤러에서 사용할 수있는 데이터를 여러보기에서 공유 할 수 있으므로 한 컨트롤러에서 다른 컨트롤러로 데이터를 전달할 때 $ rootScope 또는 HTML5 localStorage/sessionStorage를 사용할 필요가 없습니다.

단점 1. 컨트롤러의 데이터를 여러보기에서 사용할 수 있으므로 데이터가보기에 분명히 바인딩되어 있고 동일한 데이터에 암시 적으로 다양한 각도 시계가 있기 때문에 데이터를 유지 관리하기가 매우 어렵습니다. 그것은 나쁜 성능을 줄 것입니다.

이제 ng-init을 사용하여 컨트롤러의 데이터를 초기화하는 요점 1과 2에 대답하십시오. 뷰에 종속적 인 초기화를 만들었 기 때문에 좋은 접근 방법이 될 것이라고 생각하지 않습니다. 요청에 따라 뷰가 발견되지 않고 초기화가 발생하지 않는 시나리오를 만들 수 있습니다. 그리고 초기화가 발생하지 않으므로 컨트롤러에 가비지 값/버그가 있습니다. 그래서보기에서 컨트롤러 초기화를 분리하는 것이 좋습니다.

포인트 3에 대한 답변은 모든보기에 대해 별도의 컨트롤러를 사용하는 경우 사실 모 놀리 식 코드 방식을 피하는 것이므로 모듈 방식으로 접근하기 때문에 항상 좋은 지적입니다. Angular JS에서의 관심사 분리는 모든보기에 대해 별도의 컨트롤러를 사용하는 것만이 아니라 서비스 및 지시문이 장기적으로 이러한 목적을위한 것입니다.

희망은 당신을 어떤 식 으로든 돕습니다.

+0

감사합니다. Umair, 귀하의 답변에 따라 몇 가지 우려 사항이 있습니다. 1. 초기화가 발생하지 않으면 컨트롤러에서 가비지 값이 유지되는 방식. 입력 내용을 상세하게 기재 해 주시겠습니까? 2. 내 질문 포인트 3을 이해하지 못했다고 생각합니다. 누구든지 내 의견에 대해 자신의 의견을 말하면 좋을 것입니다. – Ajay

+0

포인트 1 : 귀하의보기를 찾을 수 없다면이 라인

....
은 평가되지 않습니다. 그래서 AJAX 요청을 수행하고 $ scope 속성에 데이터를 설정하는 컨트롤러의 메소드가 실행되지 않고 아무런 결과가 없습니다. 나는 당신이 아무것도 가지지 않을 것이라는 의미에서 쓰레기를 말했습니다. 보다 나은 접근법은 함수의 정의를 작성한 직후 컨트롤러에서 함수를 바로 호출하는 것입니다. 그렇게하면 아약스 요청이 확실히 수행됩니다. 그리고 그것은 또한 당신의 요점에 대한 해답이라고 생각합니다. 2. 이제 포인트 3에 대해 어떤 걱정을했는지 말해 주시겠습니까? –

+0

내보기를 찾을 수없는 경우 내 컨트롤러가 해당보기에 대해 초기화되지 않았습니다. 모든 상황에서 내 initIndustries 함수는 HTML 또는 컨트롤러를 통해 호출하여 케이스를 호출하지 않으며 내 아약스 요청은 확실히 수행되지 않습니다. 당신의 제안은 내 관심사를 해결하지 못합니다 (포인트 1과 포인트 2). – Ajay

관련 문제