1

저는 각도 필터를 사용하여 각도 상수에 중첩 된 상수의 값을 가져 오려고했습니다. 그러나 나는 값을 얻을 수있는 효율적인 방법을 찾을 수 없습니다. 나는 "^ 2.4.1"이라는 lodash를 사용할 수 있었고 _.pick을 사용해 보았지만 여전히 루트 레벨 상수에만 액세스 할 수 있었고 중첩 된 것들은 사용할 수 없었습니다.angularjs에서 중첩 된 상수의 값을 얻는 방법은 무엇입니까?

//consider this 
angular.module('myApp',[]) 

.constants('appConstants', { 
    CONS1: 'root', 
    CONS2: { 
      NEST1: 'nested cons1', 
      NEST2: 'nested cons2', 
    } 
) 
.filter(getConstants, function () { 
    return function (input) { 
     var value = appConstants[input]; 
     if (! value) { 
      var keys = input.split('.'); 
      value = appConstants; 
      angular.forEach(keys, function(key, index) { 
       value = value[key]; 
      }); 
     } 
     return value; 
    } 
}); 

//where as 
appConstants[CONS1]; //works 
appConstants[CONS2.NEST1]; // return undefined 
//in lodash 
_.pick(appConstants, 'CONS2.NEST1'); // returns empty object 

답변

2

당신은 또한 Angular $parse function를 사용할 수있는 옵션이 있습니다. 컨텍스트 매개 변수로 루트 상수 개체를 제공하면이 방법이 효과가 있다고 생각합니다. 내가 lodash 2.4.1의 이전 버전을 사용할 수있어 때문에 나는 _.get 사용할 수 없습니다

$parse(input)(appConstants) 
+0

코드를 변경하는 제안 된 수정 사항을 승인하지 마십시오. [코드를 편집해야하는시기는 언제입니까?] (http://meta.stackoverflow.com/a/260246/1218980) –

+0

괜찮 았지만 그 대답은 내 대답과 아무 관련이 없습니다. –

+1

네,하지만 그건 당신에게 통보하는 유일한 방법입니다, 그래서 제안 된 편집 리뷰에 대한 의견이 없습니다. 방법으로 좋은 대답! –

1

사용 AngularJS와는

AngularJS constant 단지로 정의되는 값 (여기에서는 오브젝트) 상수이다. NEST1를 얻으려면

{ 
    CONS1: 'root', 
    CONS2: { 
      NEST1: 'nested cons1', 
      NEST2: 'nested cons2', 
    } 
} 

는, 보통 property accessors 사용하여 점 표기법 appConstants.CONS1.NEST1 또는 브래킷 표기법 appConstants["CONS1"]["NEST1"]. HTML 템플릿

에서 가장 간단한 방법은 정수를 액세스


그냥 $rootScope으로 상수 객체를 추가하는 것입니다.

angular.module('myApp', []) 
    .constants('appConstants', { 
     CONS1: 'root', 
     CONS2: { 
      NEST1: 'nested cons1', 
      NEST2: 'nested cons2', 
     } 
    }) 
    .run(function($rootScope, appConstants) { 
     $rootScope.CONSTANTS = appConstants; 
    }); 

그리고 어떤 템플릿에서도 CONSTANTS을 개체로 사용하십시오.

<span>{{ CONSTANTS.CONS2.NEST1 }}</span> 

출처 : 당신이 정말로 올바른 중첩 된 개체를 해결하기 위해 복잡한 경로를 가능하게하는 _.get function를 사용 lodash를 사용하려면 Lodash

를 사용 Can I directly access module constant from HTML under AngularJS


.

.filter("const", function() { 
    return function(input) { 
     return _.get(appConstants, input); 
    }; 
}); 

가 값을 얻기 위해 필터에 문자열 경로를 전달합니다으로

_.get(appConstants, "CONS1.NEST1"); 

그래서 필터는 간단 할 수있다.

{{ "CONS2.NEST1" | const }} 

내장 대안은, 내 의견으로는,이 경우 Lodash보다 더 좋은 방법입니다 그녀의 대답에

Amy Blankenship presents Angular's $parse

을 Lodash합니다. 내가 lodash 2.4.1의 이전 버전을 사용할 수있어 때문에


나는 _.get을 사용할 수 없습니다.

_.get은 매우 복잡 간단한 구현을 확인합니다 stand-alone lodash package for _.get

  • 를 사용하지만, 우리의 간단한 경우, 점에 간단한 문자열 split에 대한 :

  • 두 가지 옵션이 있습니다 아마 할 것입니다.

    .filter("getConstants", function() { 
        return function(input) { 
         var obj = appConstants, 
          path = input.split('.'), 
          index = 0, 
          length = path.length; 
    
         while (obj != null && index < length) { 
          obj = obj[path[index++]]; 
         } 
         return obj; 
        }; 
    }); 
    
    +0

    : 같이 보일 수

    . 문제는 내가 (HTML) 내보기에서 문자열로 개체 경로를 전달할 수 있습니다. {{CONS2.NEST1 | getConstant}} <- 필터에 도달하면 이것이 작동하지 않고 정의되지 않습니다. 그래서 그것을 필터로 전달할 때 -> {{ 'CONS2.NEST1'| getConstant}} –

    +1

    @BalajeeKs lodash 2.4.1과 관련된 섹션을 추가했습니다. –

    +0

    @BalajeeKs 다른 게시물의 코드를 편집하지 마십시오. 이 코드는있는 그대로 작동하며 이미 루트 수준 속성을 처리합니다. See [나는 코드를 편집해야합니까?] (http://meta.stackoverflow.com/a/260246/1218980) –

    0

    상수 선언에서 닫는 중괄호 ('}')를 잊었습니다.

    어쩌면이 시도 :

    .constants('appConstants', { 
        CONS1: 'root', 
        CONS2: { 
          NEST1: 'nested cons1', 
          NEST2: 'nested cons2', 
        } 
    }) 
    
    +0

    죄송합니다. Jermy, 나는 괄호가 빠졌습니다 :}이 예제에서. 내 코드에 맞았 어. –