我正在使用Zend生成我的主视图主机。因此,它是唯一在服务器端解析的HTML。我的服务器知道一个配置参数,我想一直传递到我的一个视图模型。我不想让视图模型通过ajax请求这些数据。
如何让我的视图通过main.js,通过shell,向下传递数据到durandal中的视图模型?
现在我正在设置一个讨厌的全局值,然后在我的index.phtml:中的视图模型中引用该全局值
<script>
//This sucks, but i don't know how to pass stuff down into Durandal yet...
//
window.ServiceRoot = "<?=$this->contentRoot?>";
</script>
在一个直接的KO应用程序中,我会把它传递给KO视图模型构造函数(或设置一个可观察的属性)。
从技术上讲,我使用的是durandal 2.0预发布版,但我认为这并不重要。我想我需要像传递主参数一样,通过require.js脚本标记传递参数。
我建议您添加一个config.js模块来保存您的"配置"数据。添加一个初始化函数,从服务器获取配置数据并缓存。
然后。。。在shell.js的activate函数中,在绑定视图之前初始化配置。
然后,您可以在所有视图模型中要求配置模块,它只会返回缓存的数据。
config.js
define(['dataaccessmodule'], function (dataaccessmodule) {
var config =
{
serviceRoot: null,
init: init
};
var init= function()
{
// get config from server and set serviceRoot;
// return a promise
};
return config;
});
shell.js
define([... your required modules..., 'config'],
function (..., config) {
function activate() {
return config.init().then(boot);
};
function boot() {
// set up routing etc...
// activate the required route
return router.activate('home');
};
});
someViewModel.js
define([... your required modules..., 'config'],
function (..., config) {
var someViewModel =
{
serviceRoot: config.serviceRoot
};
return someViewModel;
});
我知道你说过你不想通过ajax加载数据,但使用这种方法,你只需要加载一次并重新使用它。如果需要,你也可以加载额外的配置。这使用单一责任原则很好地分离了代码。
编辑:
如果你真的需要在你的渲染页面上做这件事,你可以按照以下几行做:
<script>
var myapp = myapp || {};
myapp.config= (function() {
var contentRoot = "<?=$this->contentRoot?>";
return {
contentRoot: contentRoot
};
})();
</script>
然后,在您的main.js中,在定义主模块之前,您可以使用将其短路
define('appconfig', [], function () { return myapp.config; });
然后,您可以像往常一样在视图模型中需要appconfig模块,并使用appconfig.contentRoot.