2013-07-23 4 views
2

Я использую Zend для создания моего основного хоста. Таким образом, это единственный HTML, который обрабатывается на стороне сервера. Мой сервер знает о параметре конфигурации, который я хочу передать до одной из моих моделей. Я не хочу, чтобы viewmodel запрашивал эти данные через ajax.Durandal: Как передать данные конфигурации из HTML Host в ViewModel?

Как я могу просматривать данные через main.js через оболочку, вплоть до моей модели просмотра в durandal?

Сейчас я устанавливаю значение в неприятном глобальном, то ссылках, что глобальной в моем ViewModels в моем index.phtml:

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

В прямом приложении KO я бы просто передал его на конструктор viewModel KO (или установите наблюдаемое свойство).

Технически я использую предварительный выпуск durandal 2.0, но я не думаю, что это имеет значение. Я думаю, мне нужно передать параметры с помощью тега script.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; 
    }); 

Я знаю, что вы сказали, т что вы не хотите загружать данные через ajax, но используя этот метод, вы будете загружать его только один раз и повторно использовать его. Вы также можете загрузить дополнительную конфигурацию. Это отлично отделяет код, используя принцип единой ответственности.

Edit:

Если вам действительно нужно сделать это в вашей отображаемой странице, вы можете сделать что-то вдоль этих линий:

<script> 
var myapp = myapp || {}; 

myapp.config= (function() { 

    var contentRoot = "<?=$this->contentRoot?>"; 
    return { 
     contentRoot: contentRoot 
    }; 
})(); 
</script> 

Тогда в вашем main.js, перед определением основной модуль, вы можете короткое замыкание его с помощью:

define('appconfig', [], function() { return myapp.config; }); 

вы можете потребовать модуль AppConfig в вашем ViewModel, как вы обычно вес ould и получить доступ к contentRoot, используя appconfig.contentRoot.

+0

thx для подробного ответа, и если бы не мои условия, это сработало бы неплохо. Однако я не могу «получить» свою конфигурацию с сервера через ajax, потому что config - это собственный URL-адрес сервера. Приложение размещено на разных хостах/пути/подпути и, таким образом, единственный надежный способ узнать корневой URL-адрес служб находится на самом сервере.поэтому техника ajax не будет работать для меня. Я хочу, чтобы избежать возможности обнаружения логики обнаружения в JS, если это возможно. –

+0

См. Мое редактирование. Надеюсь, это поможет. –

+0

Ваш отредактированный ответ немного взломан, но гораздо меньше, чем мой супер глобальный хак. не могли бы вы определить право на главной странице? –

Смежные вопросы