2016-09-30 2 views
1

Возможно, это просто основное недоразумение, но у меня есть небольшая проблема относительно Angular и ng-show.Угловое ng-шоу в зависимости от функции

У меня простая форма с тремя полями ввода. Я хочу показать div с infotext, но только если установлены все три поля ввода.

Мой контроллера (с 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

Попробуйте 'нг-шоу =«checkIfAllValuesAreSet()» ', как контроллер уже имеет объем и присоединить эту функцию' $ scope' – Pankaj

+0

попробовать просто нг-шоу = «checkIfAllValuesAreSet()» –

+0

он будет работать, если вы это исправить to ng-show = "vm.checkIfAllValuesAreSet()" ваш псевдоним - это 'vm' not 'myControllerCtrl', поэтому второе условие работает ... –

ответ

1

Ваш ng-show="myControllerCtrl.checkIfAllValuesAreSet()" будет запускаться только при загрузке контроллера/шаблона. Поэтому, если вы меняете что-либо в своей форме, нет ничего, чтобы вызвать функцию снова.

вы могли бы просто изменить нг-шоу, чтобы быть:

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

, который будет обновляться сразу же, если какой-либо из этих изменений.

+0

Да , вот что я понял сам и сказал вам в своем вопросе, мне было просто интересно, почему он не будет работать с этой функцией. Но я думаю, проблема в том, как вы сказали, функция будет вызвана только одна, а не как привязка к трем значениям direclty ... спасибо! Я думаю, что это единственный правильный ответ на мой вопрос до сих пор. – Vortilion

0

Вы можете использовать функцию как выражение, но убедитесь, что функция возвращает boolean. Попробуйте это:

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

Это не обязательно. Взгляните на: https://api.jquery.com/Types/ (речь идет не о jquery, а о javascript) –

+0

Посмотрите на него. Спасибо :) – MSH

2

Вы не используете $scope. Установите функцию в сферу действия контроллера, и вы хорошо идти:

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

так в вашем HTML вы будете в состоянии сделать:

ng-show="checkIfAllValuesAreSet()" 

помните, $scope являются очень важным понятием угловых. Пытаясь избежать его использования, это идея bad. Вы можете прочитать документы о $ scope here.

+0

Извините, но в этот момент мне приходится не соглашаться ... Не рекомендуется использовать глобальную область $, но вместо этого вы должны использовать собственную область, как я, с помощью «var vm = this;» Каждый разработчик AngularJS расскажет вам об этом. В противном случае вы получите много ошибок области ... – Vortilion

+0

$ scope, связанный с вашим фактическим контроллером. Мы говорим о $ scope, «глобальной $ scope», о которой вы говорите, вероятно, это $ rootScope. И да, используя $ rootScope (для этих нужд), это плохая практика. – Luxor001

+0

Просто для пояснения: когда вы объявляете контроллер, вы можете ввести его фактический объем. используя эту область, это прекрасно, потому что она ограничена в контроллере. Каждый контроллер имеет область действия. – Luxor001

Смежные вопросы