AngularJS 未定义或为空

当我编写手表处理函数时,我检查 undefinednull上的 newVal 参数。为什么 AngularJS 有这样的行为,但没有特定的实用方法?所以有 angular.isUndefined但没有 angular.isUndefinedOrNull。通过手工实现并不困难,但是在每个控制器中如何扩展角度来实现这个功能呢?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);
});
};
260416 次浏览

我给你的建议是写你自己的公用事业服务。您可以将服务包含在每个控制器中,或者创建一个父控制器,将实用程序服务分配给您的作用域,然后每个子控制器都将继承这个服务,而不必包含它。

例子: 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。只是一些选项扩展角与您自己的实用功能。

您总是可以准确地为应用程序添加它

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

为什么不简单地用 angular.isObject表示否定呢。

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

@ 史蒂夫的回答令人满意。然而,我认为发布一个稍微不同的方法可能是有用的。我使用一个名为 isValue 的方法,该方法对于除 null、 unDefinition、 NaN 和 Infinity 之外的所有值返回 true。集中在 NaN 与空和未定义的是真正的好处,该函数为我。将 Infinity 与 null 和 unDefinition 混合使用更有争议,但坦率地说,这对我的代码来说并不那么有趣,因为我实际上从未使用过 Infinity。

下面的代码受到 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)));
};
})

Loash 提供了一个检查是否未定义或 null 的速记方法: _.isNil(yourVariable)