提问人:user1906451 提问时间:11/7/2018 最后编辑:user1906451 更新时间:11/13/2018 访问量:380
带有回调函数的 Angularjs 1.5 组件模式,由 IE11 中的嵌入式对象多次调用,不更新 Angular 绑定
Angularjs 1.5 component modal with callback function that is called multiple times by embedded Object in IE11 not updating Angular binding
问:
在 IE 11 中,我有一个 Angularjs 1.5 模态组件,如下所示。模式打开,并在渲染事件时调用angular应用程序外部的函数,其中包含此组件中包含的回调函数。此外部函数启动一个安装过程,该过程启动嵌入对象,如下所示,然后定期调用回调函数。
我遇到的问题是,在从嵌入式对象调用调用的每个回调函数上,模板中没有更新绑定。控制台.log已执行,我可以在控制台中看到该消息。 绑定最初使用“启动进程”进行更新,因此绑定是正确的
<span ng-bind="$ctrl.messages[$ctrl.messages.length - 1]"></span>
我尝试按如下方式调用scope.apply,但没有任何反应。只有当 initiateprocess 完成时,绑定才会使用最终回调调用中显示的最后一条消息进行更新。因此,initiateprocess 函数阻止了绑定,但没有阻止控制台 .log 的
这是处理多个回调和更新绑定的正确方法吗
angular.module('components')
.component('testModal', {
bindings:{
modalInstance: '<',
resolve: '=',
dismiss: '&',
close: '&'
},
controller: TestController,
templateUrl: 'scripts/components/TestModal.html'
});
TestController.$inject = ['$scope'];
function TestController($scope) {
var ctrl = this;
ctrl.$onInit = function(){
ctrl.messages = [];
ctrl.messages.push('starting process');
};
ctrl.modalInstance.rendered.then(function(){
CallVanillaJSFunction(callback);
});
function callback(message){
ctrl.messages.push(message);
console.log(ctrl.messages[ctrl.messages.length - 1]);
CheckScopeBeforeApply();
}
function CheckScopeBeforeApply() {
if(!$scope.$$phase) {
$scope.$apply();
console.log('scope applied');
}
};
}
香草功能
var globalCallback;
function CallVanillaJSFunction(callback){
globalCallback = callback;
var complete = initiateprocess();
globalCallback(complete);
}
嵌入对象
<OBJECT ID="testObj" CLASS......
<SCRIPT language=javascript for=testObj event="OnEvent(message);">
if(navigator.userAgent.indexOf("Trident") != -1)
{
globalCallback(message);
}
</SCRIPT>
这个问题已被标记为重复,但看了重复项后,我认为它不一样。全局回调函数可以被多次调用,而 angular 应用程序不知道会被调用多少次。
答:
0赞
georgeawg
11/9/2018
#1
使用该服务强制浏览器勾选:$timeout
function callback(message){
$timeout(function() {
ctrl.messages.push(message);
console.log(ctrl.messages[ctrl.messages.length - 1]);
});
̶C̶h̶e̶c̶k̶S̶c̶o̶p̶e̶B̶e̶f̶o̶r̶e̶A̶p̶p̶l̶y̶(̶)̶;̶
}
如果消息的更新都在同一浏览器勾选中发生,则仅呈现上次更新。该服务执行框架摘要周期和浏览器呈现周期。$timeout
有关详细信息,请参阅 AngularJS $timeout 服务 API 参考
评论
0赞
user1906451
11/9/2018
谢谢@georgeawg,这确实适用于我之前概述的案例。但是,我已经添加了有关页面上的对象如何调用回调的更多详细信息,当我调用$timeout现在我收到摘要错误错误:[$rootScope:inprog] $digest已在进行中
0赞
user1906451
11/13/2018
我更新了问题。函数 initiateprocess 似乎阻止了绑定的更新,即使嵌入对象中的回调在绑定变量更改的确切位置记录到控制台
评论