如果作用域中的变量存在,我想调用一个函数。我正在使用:
$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
,也不知道我做的是否正确。请任何想法。
答案 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
}