javascript - 在 Angular Controller 中处理异步更新的正确方法

标签 javascript angularjs asynchronous

这是我的设置——我有一个 Controller ,它使用一个服务来完成一些工作,然后异步返回数据。在本例中,数据是通过超时返回的,但在现实生活中,这会做一些更有趣的事情:

查看:

<div ng-controller="RootController as root">

  <h1>Angular Project</h1>
  <div ng-show="{{root.greeting}}">
    <p>{{root.greeting}}</p>
  </div>

</div>

Controller :

(function(){

  'use strict';

  function RootController(greetingService) {

    var vm = this;
    vm.greeting = '';

    // startup logic
    activate();

    function activate() {
        greetingService.greeting().then(
          function( response ) {
              vm.greeting = response;
          },
          function( error ) {
              vm.greeting = error;
          }
        );
    }
  }
  RootController.$inject = ['greeting'];
  angular.module('app.core').controller('RootController', RootController);

})();

服务:

(function() {
  'use strict';

  // Greeting Service
  function greeting( $timeout ) {

    // public API
    var service = {
        greeting:   greeting
    };
    return service;

    // internal functions
    function greeting() {
        return $timeout( function() {
            return 'Hello world!'; 
        }, 1000 );
    }

  }

  temp.$inject = ['$timeout'];
  angular.module('app.core').factory( 'greeting', greeting );

})();

问题:

  1. 为什么当超时解决并且 Controller 中发生 vm.greeting 分配时我的 View 没有更新?我见过人们描述“Angular 内部与 Angular 外部”,但在我看来,我在这里并没有“Angular 外部”。

  2. 我知道我可以调用 $scope.$apply(),但我遇到了“digest is already in progress ”错误,而且我似乎不必这样做。

  3. 我应该有更好的方式来组织我的组件吗?我还尝试过通过 $rootScope 广播事件并在 Controller 中编写事件处理程序,但这种安排表现出相同的结果(即,当异步模型更改发生时, View 不会更新)。

最佳答案

ng-show 不需要大括号

https://docs.angularjs.org/api/ng/directive/ngShow

改变

<div ng-show="{{root.greeting}}">

<div ng-show="root.greeting">

关于javascript - 在 Angular Controller 中处理异步更新的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28685344/

相关文章:

javascript - 如何使用 aria-label 和 aria-labelledby 从读者那里获得可见和不可见(定制)的值(value)?

javascript - "Could not find a declaration file for module"导入现有 .jsx 文件时

javascript - AngularJS $资源参数名称

c# - 秒表计时异步/等待方法不准确

java - Spring异步文件上传

javascript - 使用 Javascript 的 Ajax 请求在 iPhone 浏览器中不起作用

javascript - 在 Angular 中使用 $scope 属性的最佳实践

java - 使用 Selenium 测试 Angularjs 应用程序

java - Spring 启动: Async request not returning anything

javascript - 单击按钮后刷新并重定向页面