首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Angularjs1.5组件模式,带有回调函数,由IE11中的嵌入式对象多次调用,不更新角度绑定

Angularjs1.5组件模式,带有回调函数,由IE11中的嵌入式对象多次调用,不更新角度绑定
EN

Stack Overflow用户
提问于 2018-11-07 22:26:30
回答 1查看 290关注 0票数 1

在IE 11中,我有一个Angularjs 1.5模式组件,如下所示。模式打开,在render事件中,它使用包含在该组件中的回调函数调用angular应用程序外部的函数。这个外部函数启动一个安装过程,该过程启动一个如下所示的嵌入式对象,然后周期性地调用回调函数。

我遇到的问题是,在从嵌入式对象调用调用的每个回调函数上,模板中的绑定都没有更新。执行console.log后,我可以在控制台中看到该消息。绑定最初是用'starting process‘更新的,因此绑定是正确的

代码语言:javascript
运行
复制
<span ng-bind="$ctrl.messages[$ctrl.messages.length - 1]"></span>

我尝试调用scope.apply,如下所示,但是什么也没有发生。只有在initiateprocess完成后,才会使用最后一个回调调用中显示的最后一条消息来更新绑定。所以initiateprocess函数会阻塞绑定,但不会阻塞console.log的

这是处理多个回调和更新绑定的正确方式吗

代码语言:javascript
运行
复制
  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');
    }
  };

}

香草函数

代码语言:javascript
运行
复制
var globalCallback;

function CallVanillaJSFunction(callback){
    globalCallback = callback;
    var complete = initiateprocess();
    globalCallback(complete);
}

嵌入式对象

代码语言:javascript
运行
复制
<OBJECT ID="testObj" CLASS......
<SCRIPT language=javascript for=testObj event="OnEvent(message);">
      if(navigator.userAgent.indexOf("Trident") != -1)
      {
         globalCallback(message);
      }
    </SCRIPT>

这个问题已经被标记为重复的,但看过重复的问题后,我不认为它是相同的。全局回调函数可以被多次调用,并且angular应用程序不知道它将被调用多少次。

EN

回答 1

Stack Overflow用户

发布于 2018-11-09 02:11:29

使用$timeout服务强制浏览器计时:

代码语言:javascript
运行
复制
  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 Service API Reference

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53191420

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档