it-swarm.asia

غير معرف أو لاغٍ لـ AngularJS

عندما أكتب وظائف معالجة الساعة ، أتحقق من newVal param في undefined و null. لماذا AngularJS لديه مثل هذا السلوك ، ولكن ليس لديه طريقة فائدة معينة؟ لذلك هناك angular.isUndefined لكن ليس angular.isUndefinedOrNull. ليس من الصعب تنفيذ ذلك يدويًا ، لكن ما مدى امتداد الزاوي للحصول على هذه الوظيفة في كل وحدة تحكم؟ نور العيون.

تحرير :

المثال:

$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);
    });
};
77
slo2ols

يمكنك دائمًا إضافته بالضبط لتطبيقك

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

اقتراحي لك هو كتابة خدمة المرافق الخاصة بك. يمكنك تضمين الخدمة في كل وحدة تحكم أو إنشاء وحدة تحكم أصل ، وتعيين خدمة الأداة المساعدة لنطاقك ، ثم سيرثها كل وحدة تحكم تابعة دون الحاجة إلى تضمينها.

مثال: 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 أيضًا. فقط عدد قليل من الخيارات لتمديد الزاوي مع وظائف الأداة المساعدة الخاصة بك.

16
lucuma

لقد طرحت نفس السؤال على مشرفي النزل لفترة من الوقت وأجابوا بذكر مشغل != يمكن استخدامه هنا:

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

يستخدم هذا النوع من قسري نوع JavaScript للتحقق من القيمة لـ undefined أو null.

إذا كنت تستخدم JSHint لصياغة الشفرة الخاصة بك ، فقم بإضافة مجموعات التعليقات التالية لتخبرها أنك تعرف ما تفعله - في معظم الأوقات ، يُعتبر != سيئًا.

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

لماذا لا تستخدم ببساطة angular.isObject مع النفي؟ مثلا.

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

@ ستيفر الإجابة مرضية. ومع ذلك ، أعتقد أنه قد يكون من المفيد نشر نهج مختلف قليلاً. أستخدم طريقة تسمى isValue والتي تُرجع إلى كل القيم باستثناء القيم null و undefined و NaN و Infinity. التكتل في NaN مع وجود قيمة خالية وغير محددة هو الفائدة الحقيقية للوظيفة بالنسبة لي. يعتبر Lumping Infinity in مع null و 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('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)));
  };
})
6
Steven Wexler

lodash يوفر طريقة مختصرة للتحقق مما إذا كان غير محدد أو فارغ: _.isNil(yourVariable)

2
nigong