在angularjs中查找变量是否为空

时间:2018-07-05 06:45:56

标签: javascript angularjs

如果作用域中的变量存在,我想调用一个函数。我正在使用:

$scope.$watch('product_files', function () {
   $scope.uploadNewProduct($scope.product_files);
});
$scope.uploadNewProduct=function(files){
console.log("hello");
  if(files && files.length){
    console.log("hello");
  }
}

$scope.product_files是具有扩展名的文件,我使用输入type=file上传,但是每次显示undefined时都显示。

我从没使用过$scope.watch,也不知道我做的是否正确。请任何想法。

2 个答案:

答案 0 :(得分:3)

不需要使用$ watch,而是将ng-change指令与文件选择器一起使用:

<input type="file" select-ng-files ng-model="product_files"
       ng-change="upLoadNewProduct(product_files)" />
app.directive("selectNgFiles", function() {
  return {
    require: "ngModel",
    link: function postLink(scope,elem,attrs,ngModel) {
      elem.on("change", function(e) {
        var files = elem[0].files;
        ngModel.$setViewValue(files);
      })
    }
  }
});
$scope.uploadNewProduct=function(files) {
  if(files && files.length){
    console.log("hello");
  }
}

有关更多信息,请参见ng-model for <input type="file"/> (with directive DEMO)

答案 1 :(得分:1)

您误解了$watch的概念,我将说明:

  

首先,AngularJS定义了所谓摘要的概念   周期。这个周期可以看作是一个循环,在此期间AngularJS   检查所有人监视的所有变量是否有任何更改   $ scopes。因此,如果您在控制器中定义了$ scope.myVar   并且此变量被标记为正在监视,那么您就是   隐式告诉AngularJS在每个容器中监视myVar上的更改   循环的迭代。

     

一个自然的后续问题是:一切都附属于   正在监视$ scope?幸运的是,没有。如果您要注意变化   到$ scope中的每个对象,那么摘要循环很快就会开始   需要评估,您很快就会遇到性能问题。   这就是AngularJS团队为我们提供两种声明一些方式的原因   观察到的$ scope变量(如下所述)。

     

$ watch有助于侦听$ scope的变化

     

有两种方法可以声明要监视的$ scope变量

意思是$ watch不会告诉您变量是否为空,而是告诉您变量是否已更改。

例如:

unction MyController($scope) {

    $scope.myVar = 1;

    $scope.$watch('myVar', function() {
        alert('hey, myVar has changed!');
    });

    $scope.buttonClicked = function() {
        $scope.myVar = 2; // This will trigger $watch expression to kick in
    };
}

如果要检查变量是否存在,请创建一个函数:

$scope.isNullOrEmptyOrUndefined = function (value) {
    return !value;
}

,然后像这样检查它(例如):

if($scope.isNullOrEmptyOrUndefined(product_files) {
 //your logic
}