当前位置: 首页 > 面试题库 >

ES6 Promise不更新AngularJS DOM

梁丘经艺
2023-03-14
问题内容

我在了解角度组件范围时遇到麻烦。如果我做类似的事情:

function myComponent(){

  this.data = 'Hello World';

}



let myModule = angular.module('myModule', []);



myModule.component('myComponent', {

  template: `<div>{{$ctrl.data}}</div>`,

  controller: myComponent

});


    <script data-require="angularjs@1.5.8" data-semver="1.5.8" src="https://opensource.keycdn.com/angularjs/1.5.8/angular.min.js"></script>

<div ng-app="myModule">

  <my-component></my-component>

</div>

它可以正常打印…现在,如果我做一些小的修改并使其异步:

function myComponent(){

  Promise.resolve().then(_ => {

    this.data = 'Hello World';

  });

}



let myModule = angular.module('myModule', []);



myModule.component('myComponent', {

  template: `<div>{{$ctrl.data}}</div>`,

  controller: myComponent

});


<script data-require="angularjs@1.5.8" data-semver="1.5.8" src="https://opensource.keycdn.com/angularjs/1.5.8/angular.min.js"></script>

<div ng-app="myModule">

  <my-component></my-component>

</div>

它不会打印任何内容。我可以使用点击处理程序thouogh来更改值,但是对于http和其他异步操作而言,它将无法正常工作。


问题答案:

运行异步代码时,需要让Angular知道某些内容已更新。这使得angular运行$ digest循环,检查是否需要更新任何绑定。

为此,请将您的作业包装到的调用中$scope.$apply()

function myComponent($scope){

  Promise.resolve().then(_ => {

    $scope.$apply(() => {

      this.data = 'Hello World';

    });

  });

}



let myModule = angular.module('myModule', []);



myModule.component('myComponent', {

  template: `<div>{{$ctrl.data}}</div>`,

  controller: myComponent

});


<script data-require="angularjs@1.5.8" data-semver="1.5.8" src="https://opensource.keycdn.com/angularjs/1.5.8/angular.min.js"></script>

<div ng-app="myModule">

  <my-component></my-component>

</div>

注意,我$scope不仅在函数主体中添加了函数,而且还添加了函数参数。

阅读更多有关$scope.$apply$scope.digest



 类似资料:
  • 在async中,如果我需要将asynchronousfunction应用于1000个项目,我可以使用: 因此,同一时间只处理10个项目,从而限制开销并允许控制。 有了ES6的promise,虽然我可以很容易地做到: 这将同时处理所有1000个项目,这可能会导致很多问题。 我知道蓝鸟有办法解决这个问题,但我正在寻找ES6解决方案。

  • 以上将给出以下随机输出: 任务很简单:确保每个promise只在另一个promise之后运行()。 由于某种原因,我找不到一个方法来做这件事。 我尝试了生成器函数(),尝试了返回promise的简单函数,但最终都归结为同一个问题:循环是同步的。 对于async,我只需使用。 你怎么解决?

  • 我有一个大 gui 的 JList,我删除了所有其他不相关的代码。我可以初始化列表,但在使用按钮时无法从中添加/删除项目。我读到的所有内容都说要使用DefaultListModel。然后,当您重新初始化列表时,它将自动更新列表。 我也尝试重新聚焦并重新粉刷面板和框架,但这也不起作用。

  • 我找到了更新数据的示例,但它使用了DefaultTableModel。当我创建自己的TableModel和自己的data类时,当我将数据添加到JTable中时,它不会更新。 有我的桌子模型: 当我添加了任何信息,但它没有更新。在JTable中,我必须把这个方法放在哪里来进行正确的数据更新?

  • 问题内容: 我正在通过ng-repeat循环渲染数据。而且我希望它在更新数组时进行更新。从我阅读的内容来看,这应该会自动发生,但是这是行不通的。那我在做什么错? 的HTML: 控制器(此功能通过ng-click在按钮上触发): Console.log显示该数组已正确更新,但是我视图中的表未更改。我不知道我在做什么错。 问题答案: 那是因为您在method中更改了数组引用。 为了避免这种情况,我们使

  • 我现在迷路了。

  • 我奔跑 我得到一个错误: 无法将您的需求解析为可安装的软件包集。 当前在require dev中有以下设置: 以及我们公司创建的一个不相关的翻译包。 我正在尝试将codeception更新到最新版本。 我已经尝试过在不同的版本中设置phpunit,但我无法消除错误。 我做错了什么? 最新消息 我更新composer.json使用相同版本的包 输出,除 跑了 仍然得到错误: 那是为什么呢?在我设置新

  • 问题内容: 我正在尝试将JProgressBar添加到我的程序中,但不会更新!仅当原因为100%时,该值才会更改。这是我的方法。 更改进度栏的值位于上述方法的底部。 这就是我所谓的方法。 编辑:以上根本不是问题,问题之一是程序正在使用整数除法而不是十进制。 问题答案: 是一个整数,也是。因此发生的是小数被截断。你应该做什么,就像 这样做是确保将其除以具有十进制功能的数据类型,该数据类型将返回更具包