2016-09-14 3 views
0

모든 컨트롤러에 대해 동일한 코드를 반복합니다.AngularJS에서 재사용 할 수있는 기능 또는 서비스

는 예컨대 우리는/보여 DOM보기 CANCELLATION_IN_PROCESS을 사용하는

$scope.CANCELLATION_IN_PROCESS = function(getOrder) { 
    return getOrder.status == 'ORDER_PLACED' && getOrder.cancellableStatus == 'CANCELLATION_IN_PROCESS' && getOrder.returnableStatus == 'NON_RETURNABLE'; 
} 

는 하드 코딩 된 메시지를 숨 깁니다.

코드를 최적화 할 수있는 방법이 있습니까?

서비스를 사용해 보았지만보기에는 적용 할 수 없습니다. param "getOrder"문제는 뷰에서만 사용할 수 있으며 내 컨트롤러에서 서비스로 정의되지 않은 상태로 유지됩니다.

감사 MG

+0

보기에 적용 할 수 없다는 것은 무엇을 의미합니까? 아래 내 대답을 참조하십시오. –

답변

0
는 기지국 제어기에있어서, (필요한 경우 생성), 즉 응용 프로그램의 상단에 이동하고 controllerAs 구문을 사용

. 이름을 baseCtrl과 같게하고 baseCtrl.CANCELLATION_IN_PROCESS을 html로 사용하십시오.

angular.module('myModule').run(function($rootScope) { 
    $rootScope.CANCELLATION_IN_PROCESS = function(getOrder) { 
     return getOrder.status == 'ORDER_PLACED' && getOrder.cancellableStatus == 'CANCELLATION_IN_PROCESS' && getOrder.returnableStatus == 'NON_RETURNABLE'; 
    } 
}); 

을하고 당신의 응용 프로그램 템플릿의 어떤 부분에 사용 :

1

이 기능은 $rootScope에 부착 할 수 재사용 할과에서 추상적 인 논리 글쎄

CANCELLATION_IN_PROCESS(order) 
+0

나쁜 해결책입니다. 범위에는 논리가 포함되어서는 안됩니다. 가능할 때마다 뷰를 모델에 바인딩하는 데 스코프를 사용해야합니다. 참조 : http://stackoverflow.com/questions/32761540/why-using-rootscope-with-functions-is-not-recommended –

+0

@DeveshSati 나쁜 또는 좋은 상황에 따라 다릅니다. 이 솔루션은 가장 간단한 솔루션이며, 현명하게 사용하면 잘 작동합니다. 그리고 rootscope 대신 컨트롤러 범위를 사용하기 때문에 제공 한 솔루션은 크게 다르지 않습니다. 컨트롤러 자체로 작업하는 것이 좋습니다 (VM = this). – Nailgun

0

컨트롤러, 갈 방법은 내 생각에 서비스입니다. 서비스는 싱글 톤이기 때문에 함수를 사용하는 컨트롤러마다 반복해서 함수를 만들지는 않습니다.

뷰에서 서비스 메서드를 사용하려면 서비스 메서드를 범위 메서드로 바인딩해야합니다. controllerAs 구문을 사용하는 경우 ViewModel. 이 같은

뭔가 :

.service('statusService',function(){ 
    this.CANCELLATION_IN_PROCESS = function(getOrder) { 
     return getOrder.status == 'ORDER_PLACED' && getOrder.cancellableStatus == 'CANCELLATION_IN_PROCESS' && getOrder.returnableStatus == 'NON_RETURNABLE'; 
    } 

지금 그것을 사용하는 각 컨트롤러에 서비스를 주입하고, view.Like에 바인딩이 :

.controller('xyz',function($scope,statusService){ 
    $scope.cancellation_in_process=statusService.CANCELLATION_IN_PROCESS; 
}); 

로보기는 이전과 동일하게 유지됩니다 . 그러나 이것은 좀 더 DRY적인 방법이며 로직 (또는 모델)은 서비스에 있습니다. 컨트롤러는 뷰를 모델에 연결하기 만하면됩니다. 서비스가 싱글 톤이기 때문에 로직은 각 컨트롤러에 대해 다시 생성되는 것이 아니라 재사용됩니다.

0

이 작업을 수행하는 한 가지 방법은 마스터 컨트롤러에 기능을 배치하는 것입니다. 기본적으로 하위 컨트롤러는 마스터 컨트롤러 범위를 상속하므로 하위 컨트롤러에서 함수를 호출 할 때 해당 함수를 사용할 수 있습니다.

유사한 구조를 masterCtrl가 다른 컨트롤러 감싸 된 HTML을 생성하고이

app.controller('mainCtrl', ['$scope', function ($scope) { 

    $scope.CANCELLATION_IN_PROCESS = function(getOrder) { 
     return getOrder.status == 'ORDER_PLACED' && getOrder.cancellableStatus == 'CANCELLATION_IN_PROCESS' && getOrder.returnableStatus == 'NON_RETURNABLE'; 
    } 
}]); 

처럼 masterCtrl의 연료 소모량을 정의이 적용, 또는

<body ng-controller="masterCtrl"> 

    <div ng-controller="childCtrl1"> 
    .... 
    <a ng-click="CANCELLATION_IN_PROCESS(yourOrder)">Test</a> 
    .... 

    <div ng-controller="childCtrl2"> 
    .... 

당신이 필요로하는 경우 컨트롤러에 CANCELLATION_IN_PROCESS 함수의 사용자 정의 버전을 추가하려면 해당 컨트롤러에 함수를 추가하고 변경 사항을 적용하기 만하면됩니다.

내가 정확한 코드를 모르는210
0

, 그래서 여기

.factory('factory_name', function() { 
    var obj = {}; 
    var ObjFactory = { 
     obj : obj 
    } 
}); 

여기 컨트롤러에 대한 더미 조각이야

다음 서비스에 대한 더미 코드 조각의 필요에 스위트 룸 수있는 몇 가지 더미 조각의

.controller('controller_name', function(factory_name) { 
    $scope.obj = factory_name.obj; 
}); 

이제 $ scope.obj가 해당 팩토리 의 모든 기능에 액세스 할 수 있으며 컨트롤러 기능처럼보기에서 호출 할 수 있습니다