마크 업에서 각도 범위 변수 설정


95

간단한 질문 : 컨트롤러에서 읽을 수 있도록 html로 범위 값을 어떻게 설정할 수 있습니까?

var app = angular.module('app', []);

app.controller('MyController', function($scope) {
  console.log($scope.myVar);
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app='app'>
  <div ng-controller="MyController" app-myVar="test">
    {{myVar}}
  </div>
</div>

JSFiddle : http://jsfiddle.net/ncapito/YdQcX/


이를 처리하기 위해 지시문을 만드는 것이 더 나을 수 있습니다. 지시문은 매개 변수,이 지시문에 특정한 컨트롤러, 'myMap'마크 업에 대한 템플릿을 캡슐화합니다.
Ian Mercer

그게 실제로 내가 한 일입니다 ... 지시어 컨트롤러에서 $ scope.myVar에 액세스하는 데 문제가 있습니다. 스코프 변수에 액세스하기 위해 컨트롤러에서 시계를 사용해야하는 이유는 무엇입니까?
Nix

1
지침을 게시 할 수 있습니까? docs.angularjs.org/guide/directive 여기에서 " 초월 및 범위 이해"를 살펴보십시오. 아마도 범위가 필요할 것입니다 : {myVar : '='} 그리고 my-var="foo"호출 할 때 말할 것입니다. 하이픈과 camelCase를 사용합니다. 참고 : 속성 값에 액세스하기 위해 범위 정의에서 '@'를 사용하지 않으려면 foo여기에서 평가 됩니다.
Ian Mercer

1
@Nix 컨트롤러가 아닌 뷰에서 값을 초기화해야하는 이유를 설명 할 수 있습니까? 나는 그것이 값을 초기화하는 전통적인 방법이 아니라는 것을 이미 알고 있다고 가정합니다 (그렇지 않으면 묻지 않을 것입니다).
Sean the Bean

1
@SeantheBean 나는 젊고 어리석은 ...;) 나는 왜 그것을 해야하는지 전혀 모른다. 나는 아마도 무언가를 해킹하려고했을 것입니다.
Nix

답변:


139

ng-init루프 내부에 변수를 할당 할 때 작동하지 않습니다. 사용하다 {{myVariable=whatever;""}}

후행 ""은 텍스트에 대해 평가되는 Angular 표현식을 중지합니다.

그런 다음 간단히 호출 {{myVariable}}하여 변수 값을 출력 할 수 있습니다 .

여러 중첩 배열을 반복 할 때이 방법이 매우 유용하다는 것을 알았고 여러 번 쿼리하는 대신 현재 반복 정보를 하나의 변수에 유지하고 싶었습니다.


1
이 방법은 작동하지만 엉망인 것 같습니다. 즉, 일반적으로 {{}}변수 할당이 아닌 단일 변수 출력에만 사용하는 것이 좋습니다 . stackoverflow.com/a/16799763/814160 이 더 정확 하다고 말하고 싶습니다 (보기에 JS 코드가 적음).
Sean the Bean

1
@SeantheBean에 +1-나는 이것을 테스트했습니다. 자식 컨트롤러와 마크 업에 변수를 할당하는 범위에 문제가있는 것 같습니다. 이 지침은 내 목적을 위해 작동하며 견고한 솔루션으로 보입니다.
Paul Carlton

2
바인딩을 포함 할 수 없습니다 할당 -이 angular2 / 4에서 작동하지 않는 것
Demodave

1
@Demodave 대신 Typescript 코드에서 모든 컨트롤러 변수를 설정하고 템플릿을 사용하여 Typescript를 HTML에 연결해야합니다. 템플릿은 변수를 할당하지 않아야합니다.
boxmein

81

ngInit 변수를 초기화하는 데 도움이 될 수 있습니다.

<div ng-app='app'>
    <div ng-controller="MyController" ng-init="myVar='test'">
        {{myVar}}
    </div>
</div>

jsfiddle 예


3
그들이 실제 애플 리케이션을위한이 솔루션을하지 않는 것이 좋습니다 주목해야한다 (그러나 정말 대안을 제시하지 않음) : docs.angularjs.org/guide/dev_guide.mvc.understanding_model
마이크 로빈슨

이것은 나를 위해 일했지만 처음에는 변수가 컨트롤러에서 여전히 정의되지 않았습니다. 약간의 간격 루프를 만들었습니다. var interval = setInterval (function () {if ($ scope.whatever) {// dostuff clearInterval (interval);}}, 10);
roelleor 2015-06-26

19

라는 지시문을 만들기 myVar로를

scope : { myVar: '@' }

다음과 같이 부릅니다.

<div name="my_map" my-var="Richmond,VA">

특히 하이픈으로 연결된 태그 이름에 대한 지시문의 낙타 대소 문자 참조에 유의하십시오.

더 많은 정보를 볼 수 여기에 "이해 트랜스 클루 전 및 스코프"의 경우 : - http://docs.angularjs.org/guide/directive

다음 은 지시문 내에서 다양한 방법으로 속성의 값을 범위 변수로 복사하는 방법을 보여주는 Fiddle 입니다.


나는 여러 일을 할 수 있기를 원합니다 var-nick='my' var-nick2='test'. 지시문으로 구현하는 방법을 생각할 수 없다면 저는 그냥 사용할 것입니다ng-init
Nix

범위에 여러 속성을 포함 할 수 있습니다. 필요한 것은 그중 하나가 실행하려는 지시문의 이름이어야합니다 (또는 해당 지시문 이름도 html에 포함). scope: {varNick: '@', varNick2: '@'}
Ian Mercer

하지만 확장 가능하지 않습니까? 변수별로 지시문을 정의해야합니까?
Nix

아니요, 변수마다 지시문이 필요하지 않습니다. 내가 대답에 추가 한 바이올린을보세요.
Ian Mercer

읽지 못해 죄송합니다. 귀하의 예는 완벽합니다. 유일한 변경 사항은 범위입니다 { '@': '@ "}.
Nix

10

이와 같이 html에서 값을 설정할 수 있습니다. 앵귤러의 직접적인 해결책은 아직 없다고 생각합니다.

 <div style="visibility: hidden;">{{activeTitle='home'}}</div>

7
좋은 해킹 ... <div style="display: none">하지만 권장 합니다.
로저

3

ng-init아래와 같이 사용할 수 있습니다.

<div class="TotalForm">
  <label>B/W Print Total</label>
  <div ng-init="{{BWCount=(oMachineAccounts|sumByKey:'BWCOUNT')}}">{{BWCount}}</div>
</div>
<div class="TotalForm">
  <label>Color Print Total</label>
  <div ng-init="{{ColorCount=(oMachineAccounts|sumByKey:'COLORCOUNT')}}">{{ColorCount}}</div>
</div>

그런 다음 다른 섹션에서 로컬 범위 변수를 사용하십시오.

<div>Total: BW: {{BWCount}}</div>
<div>Total: COLOR: {{ColorCount}}</div>

나는이 접근 방식을 좋아합니다. 덜 해키 해 보입니다. 그러나 한 가지 설명은 ng-init에는 중괄호가 필요하지 않습니다.
mklbtz

1
$scope.$watch('myVar', function (newValue, oldValue) {
        if (typeof (newValue) !== 'undefined') {
            $scope.someothervar= newValue;
//or get some data
            getData();
        }


    }, true);

변수는 컨트롤러 이후에 초기화되므로 감시해야하고 초기화되지 않았을 때 사용합니다.


0

나는 대답을 좋아하지만 필요한 범위 변수를 설정할 수있는 전역 범위 함수를 만드는 것이 더 낫다고 생각합니다.

그래서 globalController에서

$scope.setScopeVariable = function(variable, value){
    $scope[variable] = value;
}

그런 다음 html 파일에서

{{setScopeVariable('myVar', 'whatever')}}

그러면 각 컨트롤러에서 $ scope.myVar를 사용할 수 있습니다.


0

루프에 있지 않으면 ng-init를 사용할 수 있습니다.

{{var=foo;""}}

""alows는 변수를 표시하지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.