2017-07-25 1 views
0

J'ai une application qui a été écrite en AngularJS, et j'essaie actuellement d'ajouter la fonctionnalité pour cacher les titres de certains widgets affichés sur l'une des pages Web lorsque l'utilisateur sélectionne une case à cocher pour indiquer qu'ils devraient être cachés.AngularJS- comment cacher des éléments en utilisant ng-hide?

Pour l'instant, j'ai une page qui affiche un certain nombre de widgets - sur le «titre» de chaque widget, il y a un bouton «Paramètres». Lorsque l'utilisateur clique sur le bouton Paramètres, une boîte de dialogue s'ouvre en haut de la page en cours (c'est-à-dire que l'utilisateur ne navigue pas vers une autre page - l'URL ne change pas du tout). Cette boîte de dialogue contient un formulaire avec un certain nombre de champs de saisie, dont l'un est une case à cocher que je veux utiliser pour «masquer» les en-têtes de tous les widgets de la page Web.

Je suis l'exemple à: https://docs.angularjs.org/api/ng/directive/ngHide pour essayer de le faire, mais ne peut pas sembler tout à fait pour le faire fonctionner ...

J'ai ajouté l'attribut ng-hide à mon élément HTML, comme dans le exemple:

<div data-ng-if="widget.name === 'tag-box'" ng-hide="hideWidgetHeading"> <!-- class="ng-hide"--> 
    <div class="divider"></div> 
    ... 

    <div class="divider"></div> 
    <div class="row ui-checkbox-row"> 
     <label class="col-sm-4 col-xs-6" data-i18n="Hide widget heading:"></label> 
     <div class="col-sm-8 col-xs-6"> 
      <label class="ui-checkbox"> 
       <input type="checkbox" name="noWidgetHeading" id="noWidgetHeading" ng-true-value= "'YES'" ng-false-value= "'NO'" ng-change="hideWidgetHeading()" ng-click="hideWidgetHeading()" ng-checked="hideWidgetHeading" ng-model="viewModel.hideWidgetHeading"> 
       <!-- ng-model="viewModel.hideWidgetHeading" --> 
       <span></span> 
      </label> 
     </div> 
    </div> 
</div> 

I définit la fonction hideWidgetHeading() dans le fichier ctrl.js comme suit:

function hideWidgetHeading(){ 
    if($scope.widgetHeadingCheckbox==false) { 
     $scope.$watch('noWidgetHeading', function() { 
      $scope.hideWidgetHeading = true; 
      console.log("Value of hideWidgetHeading: ", $scope.hideWidgetHeading); 
     }); 
     return true; 
    } else { 
     console.log("hideWidgetHeading() else called (Widget/ctrl.js line 440) "); 
     $scope.$watch('noWidgetHeading', function() { 
      $scope.hideWidgetHeading = false; //document.getElementById('noWidgetHeading'); 
     }); 
     return false; 
    } 

    if($scope.hideWidgetHeading) { 
     console.log("hideWidgetHeading is true- hide the widget heading: "); 

    } 
    return $scope.hideWidgetHeading; 
} 

et j'ai ajouté le CSS suivant à mon dossier widgets.scss:

.animate-show-hide.ng-hide { 
    opacity: 0; 
} 

.animate-show-hide.ng-hide-add, 
.animate-show-hide.ng-hide-remove { 
    transition: all linear 0.5s; 
} 

.umw-tag-box { 
    opacity: 1; 
} 

Quand je charge ma page comme il est actuellement, quand je clique sur le bouton Paramètres, la boîte de dialogue ouvre. Si je puis vérifier le « widget Cacher rubrique » case à cocher, puis cliquez sur Envoyer, le débogage que j'ai ajouté affiche les éléments suivants dans la console:

Value of hideWidgetHeading: true

qui me dit que le code dans la fonction $scope.$watch(...){...} est en cours d'exécution. Toutefois, si je clique sur le bouton Paramètres, puis ne cochez pas la case "Masquer le titre du widget", ou cochez-la et décochez-la à nouveau, puis cliquez sur Envoyer, la même valeur true s'affiche dans le console debug, qui indique que le code à l'intérieur de la fonction $scope.$watch(...){...} est en cours d'exécution, que l'élément 'seen' soit modifié ou non.

Questions

  1. Comment puis-je faire en sorte que le code de la $scope.$watch(...){...} ne fonctionne que lorsque l'élément « surveillé » (à savoir la case à cocher) a changé sa valeur? Comment puis-je réellement appeler le code CSS que j'ai ajouté pour masquer les éléments HTML sur le code HTML que je souhaite masquer? Ou comment puis-je faire en sorte que ce CSS «s'applique» aux éléments HTML que je veux cacher?

Modifier

j'ai changé le code HTML de la case à cocher:

<input type="checkbox" ng-model="checked" name="noWidgetHeading" id="noWidgetHeading"> 

comme l'a suggéré, et quand je navigue maintenant sur ma page, et d'ouvrir la boîte de dialogue, il affiche les widget que je m'attends:

widget

Lorsque je clique sur le bouton « Paramètres » sur le widget, la boîte de dialogue « Configurer article » ouvre au-dessus de la page:

Configure item dialog

Mais quand je sélectionne le « widget Cacher rubrique » case à cocher, il fait masque la zone de saisie étiquette « Tag » & de la boîte de dialogue:

Checkbox hides tag element

l'élément que je veux cacher est réellement affiché sur la page à partir de laquelle la boîte de dialogue est ouverte, pas sur la boîte de dialogue lui-même .. mais je n'arrive pas à comprendre comment je peux me cacher e qu'en utilisant un contrôle sur le dialogue ... Des suggestions?

+0

avez-vous essayé avec 'ng-hide =" hideWidgetHeading() "' (parenthèses ronds). J'ai remarqué aussi que vous avez le même nom pour variable dans la portée, peut-être cela conduit à un comportement inattendu, vous devez choisir si vous utilisez une portée var pour masquer (sans crochets, mais vous devez appeler la fonction) ou avec votre fonction (dans ce cas, la fonction devrait être dans la portée du contrôleur) – Kaddath

+0

Où? Sur la case à cocher ' (angular-touch.js: 440) at HTMLButtonElement.dispatch (jquery.js: 4435) at HTMLButtonElement.r.handle (jquery.js: 4121) ' – someone2088

+0

Même nom pour quelle variable dans la portée? – someone2088

Répondre

0

Donc, cela devrait fonctionner, il est même le first example shown in their docs, avec votre code, il sera:

<div data-ng-if="widget.name === 'tag-box'" ng-hide="viewModel.hideWidgetHeading"> <!-- class="ng-hide"--> 
    <div class="divider"></div> 
    ... 

    <div class="divider"></div> 
    <div class="row ui-checkbox-row"> 
     <label class="col-sm-4 col-xs-6" data-i18n="Hide widget heading:"></label> 
     <div class="col-sm-8 col-xs-6"> 
      <label class="ui-checkbox"> 
       <input type="checkbox" name="noWidgetHeading" id="noWidgetHeading" ng-true-value= "'YES'" ng-false-value= "'NO'" ng-change="logWidgetHeading()" ng-click="logWidgetHeading()" ng-checked="viewModel.hideWidgetHeading" ng-model="viewModel.hideWidgetHeading"> 
       <!-- ng-model="viewModel.hideWidgetHeading" --> 
       <span></span> 
      </label> 
     </div> 
    </div> 
</div> 

vous pouvez garder des fonctions sur les événements si vous blême pour connecter des valeurs, mais il n'y a pas besoin de cache. La directive ng-model mettra à jour votre valeur et le ng-hide devrait suivre.

function logWidgetHeading(){ 
    console.log("Value of hideWidgetHeading: ", $scope.hideWidgetHeading); 
} 

Ce que je disais à propos de la fonction ou var: dans certains cas, je l'habitude d'avoir des valeurs du champ d'application qui ne sont pas mis à jour, et la solution est d'introduire une fonction à appeler pour récupérer la valeur. C'est ce que je pensais que vous essayiez parce que ng-hide="hideWidgetHeading" montre le même nom que votre fonction: function hideWidgetHeading(){, c'est pourquoi j'ai d'abord dit que les parenthèses étaient manquantes. Donc, une autre version serait quelque chose comme ça (sans modèle ng-exprès, pour montrer une autre façon de modifier des choses avec vos événements):

<div data-ng-if="widget.name === 'tag-box'" ng-hide="getHideWidgetHeading()"> <!-- class="ng-hide"--> 
    <div class="divider"></div> 
    ... 

    <div class="divider"></div> 
    <div class="row ui-checkbox-row"> 
     <label class="col-sm-4 col-xs-6" data-i18n="Hide widget heading:"></label> 
     <div class="col-sm-8 col-xs-6"> 
      <label class="ui-checkbox"> 
       <input type="checkbox" name="noWidgetHeading" id="noWidgetHeading" ng-true-value= "'YES'" ng-false-value= "'NO'" ng-change="toggleWidgetHeading()" ng-checked="isHiddenWidgetHeading"> 
       <!-- ng-model="viewModel.hideWidgetHeading" --> 
       <span></span> 
      </label> 
     </div> 
    </div> 
</div> 

et les js:

//initialisation to the default value: 
$scope.isHiddenWidgetHeading = false; 

//function that toggles the value: 
$scope.toggleWidgetHeading = function(){ 
    $scope.isHiddenWidgetHeading = !$scope.isHiddenWidgetHeading; 
}; 

//function to retreive the value: 
$scope.getHideWidgetHeading = function(){ 
    return $scope.isHiddenWidgetHeading; 
}; 

Désolé j'étais un peu rapide dans le nommage vars et autres, mais vous devriez obtenir ce dont vous avez besoin ici ..

+0

Hey, merci pour la réponse. La raison pour laquelle j'ai tellement d'instructions 'console.log()' pour l'instant, est purement à des fins de développement/débogage, juste pour que je puisse voir ce qu'on appelle quand, quelles sont les valeurs de variables à un point donné, etc. J'ai la fonctionnalité fonctionnant, je supprimerai toutes les instructions 'console.log()'. C'est probablement juste que je suis bête, mais je ne vois pas où dans votre réponse vous cachez quelque chose à l'écran ...? Vous avez 'ng-hide =" viewModel.hideWidgetHeading "', mais je ne peux pas voir comment cela empêche réellement quelque chose d'être affiché ...? Pouvez-vous le signaler? – someone2088

+0

la directive 'ng-hide' elle-même le fait. Il évalue ce qui est à l'intérieur pour être vrai ou faux (il peut même être 'ng-hide =" true "' mais un peu inutile, il restera caché). Si vrai, il masque automatiquement l'élément. Dans mon premier exemple, il y a votre var dans votre modèle de case à cocher, cela signifie que lorsque la case change la valeur, la directive ng-hide est censée mettre à jour la visibilité en fonction de cette valeur (je n'ai pas vérifié si les modèles checkbox retournent les booléens , mais je le pense) – Kaddath

+0

Ah ok, merci. J'ai un peu peaufiné les choses et j'ai réussi à cacher quelque chose lorsque la case est cochée - il n'est pas nécessaire d'appuyer sur le bouton 'Soumettre' du formulaire - dès que la case est cochée, l'élément est caché, et dès que vous le décochez, l'élément est à nouveau affiché. Il semble que cela se passe à travers le CSS, mais il est fait sur le mauvais élément HTML pour le moment, et je ne suis pas sûr de savoir comment le faire fonctionner sur le HTML que je veux vraiment cacher ... Je vais mettre à jour mon OP maintenant. – someone2088