2013-07-23 146 views
2

我正在使用Zend来生成我的主视图主机。因此,它是在服务器端获得解析的唯一HTML。我的服务器知道一个配置参数,我想一直传递给我的一个viewmodels。我不希望viewmodel通过ajax请求这些数据。Durandal:如何将配置数据从HTML主机传递给ViewModel?

我该如何让我的视图通过main.js传递数据,通过shell,直到我在durandal中的viewmodel?

现在我设定一个讨厌的全球价值,然后引用,全球在我在我的index.phtml的ViewModels:

<script> 
     //This sucks, but i don't know how to pass stuff down into Durandal yet... 
     // 
     window.ServiceRoot = "<?=$this->contentRoot?>"; 
    </script> 

在一条直线KO的应用程序,我会刚刚通过它交给KO viewmodel构造函数(或设置observable属性)。

从技术上说,我使用的是durandal 2.0预发行版,但我不认为这很重要。我想我需要通过require.js脚本标记传递参数,就像我会主参数。

回答

2

我建议你添加一个config.js模块来保存你的“配置”数据。添加一个初始化函数以从服务器获取配置数据并缓存它。

然后...在你的shell.js的激活函数中,在绑定你的视图之前初始化配置。

然后,您可以在您的所有视图模型中要求您的配置模块,并且它只会返回缓存的数据。

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; 
    }); 

我知道你所述T您不希望通过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模块,你通常W¯¯应该使用appconfig.contentRoot访问contentRoot。

+0

thx的详细回应,如果它不符合我的条件,它会工作得很好。但是我不能通过ajax从服务器“获取”我的配置,因为配置是服务器URL本身。该应用程序托管在各种主机/路径/子路径上,因此知道服务根URL的唯一可靠方法就是服务器本身。这就是为什么Ajax技术不适合我的原因。如果可能的话,我想避免在JS中使用发现逻辑。 –

+0

看我的编辑。我希望有所帮助。 –

+0

你编辑的回复有点怪异,但是那么我的超级全球黑客就少得多了。你能不能在主机页面做定义权利? –

相关问题