Définissons un booléen simple sur la portée:

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

mymodal.controller('MainCtrl', function ($scope) {
    $scope.b = false;
});

Comment puis-je obtenir le type d'une variable dans l'expression? typeOf et Object.prototype.Tostring.call ne fonctionnent pas.

<div ng-controller="MainCtrl" class="container">
        <div>
          {{ b }}
          {{ typeOf(b) }}
          {{ Object.prototype.toString.call(b) }}
        </div>
</div>

Voici JSFiddle: http://jsfiddle.net/g8Ld80x3/2/

13
Landeeyo 8 mars 2016 à 11:46

7 réponses

Meilleure réponse

Je pense que la meilleure façon est de créer un filtre personnalisé et de l'utiliser comme vous le souhaitez dans votre expression, vous pouvez vérifier ce lien qui utilise pour obtenir les Object.keys d'un objet

Pour votre cas, vous pouvez utiliser

angular.module('customfilter', []).filter('typeof', function() {
  return function(obj) {
    return typeof obj
  };
});
18
Community 23 mai 2017 à 12:31

Comme vous essayez d'accéder au type typeof de la valeur spécifique et dans le code actuel, vous le faites dans le view qui est assez tard pour une telle opération.

Au lieu de cela, vous pouvez créer une fonction dans la portée du contrôleur et la renvoyer à partir de là:

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

mymodal.controller('MainCtrl', function ($scope) {
    $scope.b = false;
    $scope.getTypeof = function(it){ return typeof(it); };
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app='mymodal' ng-controller="MainCtrl" class="container">
        <div>
          {{ b }} : {{ getTypeof(b) }}
          
        </div>
</div>
0
Jai 8 mars 2016 à 09:01

Essayez quelque chose comme ça dans le contrôleur (je ne pense pas que ce soit possible directement dans l'expression comme vous le souhaitez):

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

mymodal.controller('MainCtrl', function ($scope) {
    $scope.b = false;
    $scope.getBType = function(test){
        return( typeof test);
    }
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app='mymodal' ng-controller="MainCtrl" class="container">
        <div>
          {{ getBType(b) }}
        </div>
</div>
1
Ionut Necula 8 mars 2016 à 09:18

Juste pour montrer la réponse de Zamboney appliquée à mon exemple de code:

Contrôleur:

angular.module('customfilter', []).filter('getType', function() {
  return function(obj) {
    return typeof obj
  };
});

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

mymodal.controller('MainCtrl', function ($scope) {
    $scope.b = false;
});

Afficher:

<div ng-controller="MainCtrl" class="container">
  <div>
    {{ b }}
    {{ b | getType }}
    <div ng-if="(b | getType) == 'number'">
      It's a number
    </div>
    <div ng-if="(b | getType) == 'boolean'">
      It's a boolean
    </div>
  </div>
</div>

Et violon: http://jsfiddle.net/g8Ld80x3/5/

7
Landeeyo 8 mars 2016 à 09:30

Vous ne pouvez pas le faire et pour la bonne raison: Expression angulaire l'analyseur interdit ce genre de choses dans les modèles.

Si vous voulez vraiment pouvoir le faire, je recommande de définir explicitement les méthodes d'assistance sur le $rootScope afin qu'il soit disponible dans tous vos modèles:

mymodal.run(function($rootScope) {
    $rootScope.typeOf = function(value) {
        return typeof value;
    };
});

Vous pouvez même référencer les méthodes de l'utilitaire Angular:

 mymodal.run(function($rootScope) {
    ['isArray', 'isDate', 'isDefined', 'isFunction', 'isNumber', 'isObject', 'isString', 'isUndefined'].forEach(function(name) {
        $rootScope[name] = angular[name];
    });
});

Et utilisez {{ isArray(arr) }} dans les modèles.

4
dfsq 8 mars 2016 à 08:57

HTML

<div ng-controller="MainCtrl" class="container">
        <div>
          {{ b }}<br>
          {{ typeOf(b) }}<br>
        </div>
</div>

JS

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

mymodal.controller('MainCtrl', function ($scope) {
    $scope.b = false;
    $scope.typeOf = function (v){ return (typeof v)};
});

RÉSULTAT

false
boolean
0
georgeawg 8 mars 2016 à 09:04
$scope.b = new String('name');

// selon la déclaration ci-dessus, l'objet sera le résultat de l'opérateur typeof. Il ne vérifie pas le type de l'opérateur typeof: http://bonsaiden.github.io /JavaScript-Garden/#types.typeof

0
Rao 24 août 2016 à 09:00