我正在构建一个MEAN应用程序,我遇到的一个问题是我想让我的用户对所使用的路由进行某种控制。所以我希望我的服务器端代码(expressJS)在我的客户端代码中设置一些变量。
基本上我希望能够从我的服务器端代码生成我的客户端JS。
例如,在PHP中我可能会按照
的方式做一些事情<?php
echo <script>
echo var test = $test
echo </script>
?>
我不是在讨论绑定,只需要在初始应用程序加载时设置变量。
以最干净的方式实现与MEAN的这种集成的最佳方式是什么......
答案 0 :(得分:4)
只是另一个approch
router.js
app.get('/myconfig', function(req, res){
var config = {prop1:1,myarray:[1,2,3]};
var json = JSON.stringify(config);
res.end('var config='+json);
});
jade
script(type='text/javascript', src='/myconfig')
比你能做的角度
angular.module('yourApp').constant('setup', config)
答案 1 :(得分:3)
选项1
首先编写一个将返回配置的api端点。
app.get('/conf', function(req, res) {
res.send(200, {
foo: "bar"
});
});
然后对此端点执行$http.get
并检索角度app.run
上的配置对象,并将此配置存储在服务/ $rootScope
/ config中。
app.run
与main()
函数的角度最接近,并且在应用程序启动时将运行一次。
选项2
使用grunt。
如果您的解决方案不需要从服务器端显式获取变量,并且在部署应用程序时已知它们,则可以使用grunt进行javascript编译和注入配置。
这就是我个人处理这种情况的方式。
答案 2 :(得分:1)
演示插件:http://plnkr.co/edit/5cFLo3wLfbL0bUnifJe5?p=preview
服务器应该只关注资源:
app.get('/api/setup', function(req,res){
var setup = // something
res.json(setup);
})
客户端可以在获取数据后推迟引导程序:
基于这个答案:Using angular services before manual bootstrap
angular.bootstrap().invoke(function($http){
$http.get('/api/setup').then(function(res){
// providing the fetched data to the module:
angular.module('yourApp').constant('setup', res.data)
// manual bootstraping
angular.bootstrap(document,['yourApp']);
})
});
然后您可以在模块中注入setup
:
app.config(function(setup){
// constants can be injected to config blocks
})
app.controller('ctrl',function(setup){
// do what you need
})
如果您需要启动画面,请查看我的回答: Creating a splash screen using ng-cloak