Quand j'écris des fonctions de manipulation de montre, je vérifie newVal param sur undefined
et null
. Pourquoi AngularJS a-t-il un tel comportement, mais n’a-t-il pas de méthode d’utilité particulière? Donc, il y a angular.isUndefined
mais pas angular.isUndefinedOrNull
. Ce n’est pas difficile à implémenter à la main, mais comment prolonger angular pour avoir cette fonction dans chaque contrôleur? Tnx.
Modifier :
L'exemple:
$scope.$watch("model", function(newVal) {
if (angular.isUndefined(newVal) || newVal == null) return;
// do somethings with newVal
}
Est-ce une pratique acceptée commune de gérer une telle manière?
Éditez 2 :
L’exemple de JSFiddle ( http://jsfiddle.net/ubA9r/ ):
<div ng-app="App">
<div ng-controller="MainCtrl">
<select ng-model="model" ng-options="m for m in models">
<option value="" class="ng-binding">Choose model</option>
</select>
{{model}}
</div>
</div>
var app = angular.module("App", []);
var MainCtrl = function($scope) {
$scope.models = ['Apple', 'Banana'];
$scope.$watch("model", function(newVal) {
console.log(newVal);
});
};
Vous pouvez toujours l'ajouter exactement pour votre application
angular.isUndefinedOrNull = function(val) {
return angular.isUndefined(val) || val === null
}
Ma suggestion est de créer votre propre service public. Vous pouvez inclure le service dans chaque contrôleur ou créer un contrôleur parent, attribuer le service utilitaire à votre étendue, puis chaque contrôleur enfant héritera de celui-ci sans que vous deviez l'inclure.
Exemple: http://plnkr.co/edit/NI7V9cLkQmEtWO36CPXy?p=preview
var app = angular.module('plunker', []);
app.controller('MainCtrl', function($scope, Utils) {
$scope.utils = Utils;
});
app.controller('ChildCtrl', function($scope, Utils) {
$scope.undefined1 = Utils.isUndefinedOrNull(1); // standard DI
$scope.undefined2 = $scope.utils.isUndefinedOrNull(1); // MainCtrl is parent
});
app.factory('Utils', function() {
var service = {
isUndefinedOrNull: function(obj) {
return !angular.isDefined(obj) || obj===null;
}
}
return service;
});
Ou vous pouvez également l'ajouter à rootScope. Quelques options pour étendre angular avec vos propres fonctions utilitaires.
J'ai posé la même question aux responsables de la maintenance lodash il y a quelque temps et ils ont répondu en mentionnant que l'opérateur !=
peut être utilisé ici:
if(newVal != null) {
// newVal is defined
}
Ceci utilise la contrainte de type de JavaScript pour vérifier la valeur de undefined
ou null
.
Si vous utilisez JSHint pour filtrer votre code, ajoutez les blocs de commentaires suivants pour lui indiquer que vous savez ce que vous faites - la plupart du temps, !=
est considéré comme incorrect.
/* jshint -W116 */
if(newVal != null) {
/* jshint +W116 */
// newVal is defined
}
Pourquoi ne pas simplement utiliser angular.isObject
avec négation? par exemple.
if (!angular.isObject(obj)) {
return;
}
La réponse de STEVER est satisfaisante. Cependant, j’ai pensé qu’il pourrait être utile de publier une approche légèrement différente. J'utilise une méthode appelée isValue qui renvoie true pour toutes les valeurs sauf null, undefined, NaN et Infinity. Lump in NaN avec null et indéfini est le véritable avantage de la fonction pour moi. Intégrer Infinity dans null et undefined est plus discutable, mais franchement pas intéressant pour mon code car je n’utilise pratiquement jamais Infinity.
Le code suivant est inspiré par Y.Lang.isValue . Voici le source pour Y.Lang.isValue.
/**
* A convenience method for detecting a legitimate non-null value.
* Returns false for null/undefined/NaN/Infinity, true for other values,
* including 0/false/''
* @method isValue
* @static
* @param o The item to test.
* @return {boolean} true if it is not null/undefined/NaN || false.
*/
angular.isValue = function(val) {
return !(val === null || !angular.isDefined(val) || (angular.isNumber(val) && !isFinite(val)));
};
Ou dans le cadre d'une usine
.factory('lang', function () {
return {
/**
* A convenience method for detecting a legitimate non-null value.
* Returns false for null/undefined/NaN/Infinity, true for other values,
* including 0/false/''
* @method isValue
* @static
* @param o The item to test.
* @return {boolean} true if it is not null/undefined/NaN || false.
*/
isValue: function(val) {
return !(val === null || !angular.isDefined(val) || (angular.isNumber(val) && !isFinite(val)));
};
})
lodash fournit une méthode abrégée pour vérifier si indéfini ou nul: _.isNil(yourVariable)