未定义或为AngularJS空

当我写手表处理函数时,我检查undefined newVal参数和null 。 为什么AngularJS有这样的行为,但没有特定的效用方法? 所以有angular.isUndefined但不angular.isUndefinedOrNull 。 手工实现并不困难,但是如何在每个控制器中扩展angular度以实现该function呢? TNX。

编辑

这个例子:

 $scope.$watch("model", function(newVal) { if (angular.isUndefined(newVal) || newVal == null) return; // do somethings with newVal } 

处理这种方式是否被普遍接受?

编辑2

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); }); }; 

您可以随时将其添加到您的应用程序

 angular.isUndefinedOrNull = function(val) { return angular.isUndefined(val) || val === null } 

我的build议是写自己的公用事业服务。 您可以将服务包含在每个控制器中,或创build一个父控制器,将实用程序服务分配给您的作用域,然后每个子控制器都将inheritance此function,而无需包含它。

例如: 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; }); 

或者您也可以将其添加到rootScope中。 只是几个选项,用您自己的实用function来扩展angular度。

我回过头问同样的问题,他们回答说,可以在这里使用!=运算符:

 if(newVal != null) { // newVal is defined } 

这使用JavaScript的types强制来检查undefined的值或null

如果您正在使用JSHint来创build代码,请添加以下注释块,告诉它您知道自己在做什么 – 大多数情况下!=被认为是不好的。

 /* jshint -W116 */ if(newVal != null) { /* jshint +W116 */ // newVal is defined } 

为什么不简单地使用angular.isObject与否定? 例如

 if (!angular.isObject(obj)) { return; } 

@SHEVER的答案是令人满意的。 不过,我认为发表一个稍微不同的方法可能是有用的。 我使用了一个名为isValue的方法,对于除null,undefined,NaN和Infinity之外的所有值都返回true。 在NaN中使用null和undefined是对我来说function的真正好处。 用无效和未定义结合无穷是更有争议的,但坦率地说,我的代码没有那么有趣,因为我实际上从来没有使用无穷大。

以下代码受Y.Lang.isValue的启发。 这里是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))); }; 

或作为工厂的一部分

 .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提供了一个简短的方法来检查是否未定义或null: _.isNil(yourVariable)