2016-09-30 7 views
1

어쩌면 그저 기본적인 오해 일 수도 있지만 Angular 및 ng-show와 관련된 작은 문제가 있습니다.기능에 따라 Angular ng-show가 표시 될 수도 있습니다.

3 개의 입력 필드가있는 간단한 양식이 있습니다. 정보 텍스트로 div를 보여주고 싶지만 세 개의 입력 필드가 모두 설정되어 있어야합니다.

내 컨트롤러처럼 보이는 (controllerAs-구문으로, 별칭은 'myControllerCtrl이'입니다) :

var vm = this; 

vm.annualConsumption = null; 
vm.calorificVal = null; 
vm.zNumber = null; 
vm.checkIfAllValuesAreSet = checkIfAllValuesAreSet; 


function checkIfAllValuesAreSet() { 
    return vm.annualConsumption && vm.calorificVal && vm.zNumber; 
} 

그래서 내 사업부에

ng-show="myControllerCtrl.checkIfAllValuesAreSet()" 

을 넣어. 그러나 모든 입력 필드를 설정하면 div가 표시되지 않습니다! 함수의 조건을 직접 ng-show에 넣으면

ng-show="vm.annualConsumption && vm.calorificVal && vm.zNumber" 

과 같이 작동합니다. 그래서 제 질문은 : 왜 ng-show의 표현식으로 함수를 사용할 수 없습니까?

+0

것은'시도 NG 쇼 = "checkIfAllValuesAreSet()"'컨트롤러는 이미 범위를 갖는 $ scope' – Pankaj

+0

'이 기능을 첨부대로하려고 단지 겨 쇼 = "checkIfAllValuesAreSet()" –

+0

당신이 그것을 수정하는 경우가 작동합니다 to ng-show = "vm.checkIfAllValuesAreSet()"별명은 'myControllerCtrl'이 아니라 'vm'입니다. 두 번째 조건이 작동하는 이유는 ... –

답변

1

ng-show="myControllerCtrl.checkIfAllValuesAreSet()"은 컨트롤러/템플릿이로드 될 때 한 번만 실행됩니다. 따라서 양식에서 내용을 변경하면 기능을 다시 트리거 할 수 없습니다.

당신은 간단하게 할 수 있도록 NG-쇼를 변경할 수 있습니다 :

ng-show="vm.annualConsumption && vm.calorificVal && vm.zNumber" 

즉시 업데이트 이러한 변화가있는 경우 것이다.

+0

예 , 그게 내가 알아 낸 것이고 내 질문에 당신에게 말했을 때, 나는 그것이 그 기능으로는 왜 작동하지 않는지 궁금했습니다. 하지만 문제는 당신이 말했듯이, 함수는 단지 하나라는 값을 가지게 될 것입니다. 나는 그것이 지금까지 내 문제에 대한 유일한 정답이라고 생각한다. – Vortilion

0

함수를 식으로 사용할 수 있지만이 함수가 boolean을 반환하는지 확인하십시오. 이 시도 : 당신은 $scope을 사용하지 않는

function checkIfAllValuesAreSet() { 
if(vm.annualConsumption !=null && vm.calorificVal !=null && vm.zNumber !=null){ 
return true; 
} 
+0

필요하지 않습니다. 다음을보십시오 : https://api.jquery.com/Types/ (jquery에 관한 것이 아니라 자바 스크립트에 관한 것입니다) –

+0

한번 살펴 보겠습니다. 고마워요 :) – MSH

2

.

$scope.checkIfAllValuesAreSet = function() { 
    return vm.annualConsumption && vm.calorificVal && vm.zNumber; 
} 

그래서 당신의 HTML에 당신이 할 수 할 수 있습니다 : 컨트롤러의 범위에 기능을 연결합니다, 당신은 갈 수 있습니다

ng-show="checkIfAllValuesAreSet()" 

기억, $scope은 매우 중요한 개념이다 angularjs의. 그것을 사용하는 것을 피하는 것은 불량 아이디어이다. $ scope here에 대한 문서를 읽을 수 있습니다.

+0

미안하지만, 그 시점에서 내가 동의해야 ... 그것은 글로벌 연습 $ 범위를 사용하는 것이 아니라 연습 대신 자신의 범위를 사용해야한다, "var에 VM을 =이;" 모든 AngularJS 개발자가 당신에게 이렇게 말하고 있습니다. 그렇지 않으면 많은 범위 오류가 발생합니다 ... – Vortilion

+0

실제 컨트롤러에 연결된 $ 범위입니다. 우리는 $ scope에 대해 말하고 있습니다. 여러분이 말하는 "global $ scope"는 아마도 $ rootScope 일 것입니다. 그리고 네, $ rootScope (그 needings)를 사용하여 나쁜 연습입니다. – Luxor001

+0

명확히하기 : 컨트롤러를 선언 할 때 실제 범위를 주입 할 수 있습니다. 그 스코프를 사용하면 컨트롤러에 갇혀 있기 때문에 완벽합니다. 모든 컨트롤러에는 범위가 있습니다. – Luxor001