Ответ 1
Вы всегда можете добавить его именно для своего приложения
angular.isUndefinedOrNull = function(val) {
return angular.isUndefined(val) || val === null
}
Когда я пишу функции обработки часов, я проверяю параметр newVal на undefined
и null
. Почему у AngularJS такое поведение, но нет специального метода утилиты? Таким образом, существует angular.isUndefined
, но не angular.isUndefinedOrNull
. Нетрудно реализовать это вручную, но как расширить angular, чтобы иметь эту функцию в каждом контроллере? Tnx.
Edit
Пример:
$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
}
Мое предложение - написать свою собственную сервисную службу. Вы можете включить службу в каждый контроллер или создать родительский контроллер, назначить служебную службу для своей области, а затем каждый дочерний контроллер наследует ее, не добавляя ее.
Пример: 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 с помощью собственных функций утилиты.
Я задал тот же вопрос о сопровождающих lodash некоторое время назад, и они ответили, указав, что оператор !=
может быть использован здесь:
if(newVal != null) {
// newVal is defined
}
Это использует принуждение типа JavaScript для проверки значения для undefined
или null
.
Если вы используете JSHint, чтобы добавить код, добавьте следующие блоки комментариев, чтобы сообщить ему, что вы знаете, что вы делаете, - большую часть времени !=
считается плохим.
/* jshint -W116 */
if(newVal != null) {
/* jshint +W116 */
// newVal is defined
}
Почему бы просто не использовать angular.isObject
с отрицанием? например.
if (!angular.isObject(obj)) {
return;
}
@STEVER ответ удовлетворительный. Тем не менее, я думал, что может быть полезно опубликовать несколько иной подход. Я использую метод с именем isValue, который возвращает true для всех значений, кроме null, undefined, NaN и Infinity. Насыщение в NaN нулевым значением и undefined является реальным преимуществом функции для меня. Lumping Infinity с нулевым и undefined более спорным, но, откровенно говоря, это не очень интересно для моего кода, потому что я практически никогда не использую Infinity.
Следующий код вдохновлен 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
.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 предоставляет сокращенный метод проверки, если undefined или null:
_.isNil(yourVariable)