2

Zend を使用してメイン ビュー ホストを生成しています。そのため、サーバー側で解析される唯一の HTML です。私のサーバーは、ビューモデルの 1 つにずっと渡したい構成パラメーターを認識しています。ビューモデルにこのデータを ajax 経由で要求させたくありません。

ビューに main.js を介して、シェルを介して、デュランダルのビューモデルにデータを渡すにはどうすればよいですか?

現在、厄介なグローバルに値を設定してから、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 スクリプト タグを介してパラメーターを渡す必要があると考えています。

4

1 に答える 1

2

「構成」データを保持する 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 を使用して contentRoot にアクセスできます。

于 2013-07-23T14:09:18.523 に答える