Javascript 角度范围界定问题
我有一个问题,通过我的Javascript 角度范围界定问题,javascript,angularjs,Javascript,Angularjs,我有一个问题,通过我的ng控制器中的一个表单似乎没有改变控制器中我认为会发生的属性。经过一段时间的阅读,我似乎没有完全意识到原型继承,但多亏了,我更新了我的代码。但不幸的是,它仍然不起作用,我不知道为什么 这是我的HTML <div ng-app="licenceApp" ng-controller="licenceController"> <div class="hover panel" ng-class="{switch : licenceFormVisib
ng控制器中的一个表单
似乎没有改变控制器中我认为会发生的属性。经过一段时间的阅读,我似乎没有完全意识到原型继承,但多亏了,我更新了我的代码。但不幸的是,它仍然不起作用,我不知道为什么
这是我的HTML
<div ng-app="licenceApp" ng-controller="licenceController">
<div class="hover panel" ng-class="{switch : licenceFormVisible}">
<div class="highlightedSection nosidepad clearfix back">
<div class="highlightedSubSection" ng-class="{fullsize : uploadModel.active}" ng-show="!Applying && !FinishedWithErrors && !offlineActivationScreenVisible">
<h2>Licence File</h2>
Upload and apply a valid licence file{{uploadModel.active}}<br /><br />
...
<form id="hiddenUploadForm" name="hiddenUploadForm" target="hiddenUploadFormFileTarget" action="/settings/uploadILP" method="post" enctype="multipart/form-data" style="display: none;">
<input id="hiddenUploadFormFile" name="file" type="file" ng-model="uploadModel.uploadFileName" onchange="angular.element(this).scope().uploadFileChanged()" />
<iframe id="hiddenUploadFormFileTarget" name="hiddenUploadFormFileTarget" iframe-onload="uploadFileFinished()"></iframe>
</form>
</div>
</div>
</div>
因此,当我在函数中更改
uploadModel.active
时,它会通过console.log
显示正确的值,但显示不会模拟新值!我在这里还受原型遗传的影响吗?请注意,当输入文件控件更改时,uploadFileChanged
会被点击。onchange是angular之外的javascript事件,因此您需要调用$apply
来通知angular范围内的更改。幸运的是,有一个angular指令可以为您做到这一点()
如果您计划使用输入类型文件,则可能需要创建一个简单的指令来处理更改事件,而无需以这种方式访问元素范围。是的,我只是仔细检查了一下,它对输入不起作用。。在这种情况下,我只需要在我的函数中使用$apply吗?ngChange只需要ngModel就可以工作,所以如果输入字段有ngModel,它应该可以工作。谢谢。如果我添加代码,我会在应用行中得到一个错误,即:
uncaughttypeerror:undefined不是一个函数
,它是$apply
:D-好的,这很好,很有效,谢谢。但我能问一下为什么吗?为什么在其他功能中我不需要申请?它必须在执行函数时找到作用域?由于双向数据绑定的工作方式,当您更改模板中使用的$scope中的属性时,需要在该属性以某种方式更改时通知它,它使用的方式称为$digest,这是一个递归函数,它在所有范围内运行,检查它应该与模板保持同步的字段中的相等性检查。
angular.module('licenceApp.controllers', [])
.controller('licenceController', ['$scope', 'licenceAPIservice', '$filter', '$timeout', function ($scope, licenceAPIservice, $filter, $timeout) {
$scope.uploadModel = {
active: false,
uploadFileName: "",
uploading: false
};
$scope.uploadFileChanged = function () {
$scope.uploadModel.active = true;
$scope.uploadModel.uploading = true;
$('#hiddenUploadForm').submit();
}
...
<input id="hiddenUploadFormFile"
name="file" type="file"
ng-model="uploadModel.uploadFileName"
ng-change="uploadFileChanged()" />
<input id="hiddenUploadFormFile"
name="file" type="file"
onchange="angular.element(this).scope().uploadFileChanged()"/>
$scope.uploadFileChanged = function () {
$scope.$apply(function() {
$scope.uploadModel.active = true;
$scope.uploadModel.uploading = true;
$('#hiddenUploadForm').submit();
});
}