2016-09-16 71 views
1

我想从Angular 2应用程序中的服务器加载配置文件,并且您可以想象它包含整个应用程序所需的初始化参数,因此它必须首先加载。Angular 2:推迟组件加载

问题是,JS是异步设计,所以没有办法让应用程序“等待”偏好文件。我已经创建了一个使用异步AJAX请求发送请求的服务,但是我不知道如何处理其他部分在缓存尚未加载时询问此服务“哪个是此首选项的值”。我无法拒绝请求,也无法阻止它们,使它们异步无效。

应该有一种方法来停止在“加载”屏幕中的应用程序,我相信这是做到这一点的正确方法。当应用程序处于此模式时,会加载首选项,然后显示UI。

问题:如何推迟加载主要组件直到加载阶段结束?加载一个检查一系列必要条件并初始化服务的组件(连接,设置,认证等),然后在全部满足之后加载主UI,这将是很好的。

+0

APP_INITIALIZER应该做你想要的东西http://stackoverflow.com/questions/39033835/angularjs2-preload-server-configuration-before-the-application-starts/39033958#39033958 –

+0

这工作!如果你想为它做出回答,我可以标记为已接受 – Mc128k

+0

如果你不介意的话,我会重复它 –

回答

1

在Angular2 Dart中,我使用Future使其工作;那么无论需要那个财产只需await那个价值。 请参阅:https://www.dartlang.org/tutorials/language/futures

Future gatherNewsReports() async { 
    // more slow code here 
    String path = 
     'https://www.dartlang.org/f/dailyNewsDigest.txt'; 
    return (await HttpRequest.getString(path)); 
} 

Future printDailyNewsDigest() async { 
    String news = await gatherNewsReports(); 
    print(news); 
} 

我相信你可以的,如果你不使用飞镖在JavaScript中做同样的Promises。 见:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

async function printDailyNewsDigest() { 
    var news = await gatherNewsReports(); 
    console.log(news); 
} 

在未来/承诺完成后,触发URL变化则可以加载所需的页面。

JavaScript和Dart是SingleThreaded,如果你在任何时候阻塞,没有东西会继续工作。

+1

DART中也存在'APP_INITIALIZER'。随着它Angular2等待初始化,直到它返回的future/promise/observable已经解决。 –

+0

'APP_INITIALIZER'被标记为实验,是否包含在最终版本中? –

+0

我很确定它仍然包含在内。我还没有看到一些突破性变更通知。 –