2014-12-04 45 views
0

我有错误(或可能错误的用法?)与UI路由器,解决,工厂和$ http.get调用。

下面的代码中配置部分片段:

$stateProvider 
    .state('index', { 
     url: '/', 
     views: { 
      '': { 
       templateUrl: './views/layout.html', 
       controller: 'MyAppCtrl' 
      }, 
      '[email protected]': { 
       templateUrl: './views/app-navbar.html' 
      }, 
      '[email protected]': { 
       templateUrl: './views/app-accordion.html', 
       controller: 'AppController', 
       resolve: { 
        appPromiseObj: function (AppFactory) { 
         return AppFactory.getApps(); 
        } 
       } 
      }, 
... 

,并具有以下AppFactory

myApp.factory('AppFactory', function ($http) { 
    var appFac = { 
     apps: [] 
    }; 

    appFac.getApps = function() { 
     promiseObj = $http 
      .get('http://localhost:4567/applications') 
      .success(function (data) { 
      console.log("success calling http"); 
      angular.copy(data, appFac.apps); 
     }); 
     return promiseObj; 
    }; 
    return appFac; 
}); 

但是当我运行应用程序,在“成功的console.log消息'回调永远不会被执行。浏览器控制台日志显示http调用在代码200下执行OK。我假设这意味着角度认为它失败了,或者我应该做其他事情吗?

我甚至尝试返回$ q承诺对象(如其他有些相关的堆栈溢出线程所示),但没有成功。在工厂代码中,如果我使用测试数据(即没有HTTP调用),即使我不返回承诺对象,一切正常。关于问题出在哪里的任何指针?欣赏任何指点来帮助我调试...

回答

0

我创建了working plunker here。问题是不正确承诺处理AppFactory.getApps()内部。我们需要在开始时返回诺言,然后返回一些成功调整的东西。现在,它的工作原理...

这是我提出的主要变化:

// INSTEAD of this 

// appFac.getApps1 = function() { 
//  promiseObj = $http.get('http://localhost:4567/applications') 
//  .success(function (data) { 
//  console.log("success calling http"); 
//  angular.copy(data, appFac.apps); 
//  }); 
//  
//  return promiseObj; 


// Let's use this 

appFac.getApps = function() { 
    return $http 
     .get('http://localhost:4567/applications') 
     .success(function (data) { 
     console.log("success calling http"); 
     angular.copy(data, appFac.apps); 
     return appFac.apps 
    }); 

    // this is already returned above 
    //return promiseObj; 

检查它在行动here

根据您的扩​​展plunker EXTEND

(还没有完全工作如预期)

- http://plnkr.co/edit/c89j3eFvYyguMt0QznAI?p=preview

我创建adjsuted和干活版本

唯一的变化是适当的命名(例如app.js被加载为脚本而不是script.js ...)。但最终,许现已解决,这JSON:

[{"id":10566982,"networkID":34256899,"appID":56114114 
    ,"name":"10566982name","description" 
    ... 
] 

被加载并转换成手风琴:

  • 56114114name
  • 58616695name

最后回答你的问题在下面的评论中:

但promiseObj = $ http(...)...之间的区别是什么?返回promiseObj并返回$ http(...); ?

有没有区别(除了我看到我的方法更清晰一点)。真正的区别在于:

angular.copy(data, appFac.apps); 

VS

return appFac.apps 

.success()方法的最后陈述。它必须返回一些东西。这是绝招

+0

Radim - 首先谢谢你。我想我已经习惯了JS(作为Java程序员和所有这些),但promiseObj = $ http(...)...之间的区别是什么?返回promiseObj并返回$ http(...);也就是说,我看到的巨大差异是你正在返回appFac.apps。当我在本地尝试它时,它似乎仍然不起作用。我现在看到这个调用成功了,但是控制台消息仍然没有显示(也没有GUI的其余部分:()。我创建了一个plunker:http://plnkr.co/edit/c89j3eFvYyguMt0QznAI?p=preview Any想法? – user3379755 2014-12-04 18:20:18

+0

先生,我解决了你的问题,并用更多的答案更新了答案。希望这会有所帮助;) – 2014-12-05 06:44:32

+0

Radim - 感谢更多的见解,真的有所帮助。这是我第一次端到端的Angular PoC,所以很多问题/为我学习! – user3379755 2014-12-05 18:23:00