2015-02-23 42 views
0

这是我的设置 - 我有一个控制器使用的服务有一些工作,然后异步返回数据。在这种情况下,数据是通过超时返回,但在现实生活中,这将做一些更有趣:适当的方式来处理角度控制器中的异步更新

查看:

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

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

</div> 

控制器:

(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. 为什么我的视图在超时结算并且vm.greeting赋值发生在我的控制器中时没有更新?我曾经见过人们描述过“Angular vs Angular”,但在我看来,我并没有在这里“走出Angular”。我知道我可以调用$ scope。$ apply(),但我遇到了“digest is already in progress”错误,并且它似乎并不像我应该这样做。

  2. 有没有更好的方法我应该组织我的组件?我也尝试过在$ rootScope上广播一个事件,并在Controller中写入一个事件处理程序,但是这种安排表现出相同的结果(即当发生异步模型更改时不更新视图)。

+0

它实际上是否使用.success?你可以验证vm.greeting实际上是否被设置? – ribsies 2015-02-23 23:10:45

+0

@ribsies是的。我编辑了这个问题的代码以除去所有无关的内容,但超时正在解决,我的.then(成功)函数正在执行。当我在Chrome Dev Tools中调试范围并查看angular.element($ 0).scope()。root.greeting的值时,我看到了正确的值。 – Alex 2015-02-23 23:16:24

回答

0

的方式你有你的结构代码是一个ve与我平时所做的不同。看看这个链接是一个伟大的风格指南。 http://toddmotto.com/opinionated-angular-js-styleguide-for-teams/

至于您的问题,Angular使用$ scope将控制器中的值绑定到视图。所以你的控制器应该注入$ scope,然后你可以做$ scope.greeting来代替vm.greeting。

+0

$范围的使用(或缺乏使用)不是我的问题。使用“controller as ...”语法意味着您不要将属性和函数分配到$ scope,而是分配给Controller对象。 – Alex 2015-02-23 23:55:11

+0

就像我说过的,我做的事情不同,但我会留下我的回答,因为风格指南值得一读。 – Davie 2015-02-23 23:57:08

+0

将看看你指的那个链接。我已经看了很多例子,但喜欢这个指导到目前为止:https://github.com/johnpapa/angularjs-styleguide – Alex 2015-02-24 01:36:31