2013-06-10 3 views
3

В моем shell.js есть действие, которое можно вызвать для сбора некоторых данных из конечной точки API (список билетов). Как только у меня есть эти данные, я router.navigateTo("purchase"),, который является допустимым маршрутом.Durandal: У меня есть данные в оболочке - как я могу нажать ее в режиме просмотра?

Мне нужно передать эти данные в viewModel сейчас. Есть ли какой-либо стандартный подход к этому с DurandalJS, или мне нужно изучить какой-то механизм pub/sub?

Одно из решений (которые я реализовал на данный момент) является просто использовать окно - в shell.js после того, как вызов службы данных завершен, я говорю window.tickets = dataFromService. Тогда в «покупке» VM, я отрабатывать window.tickets. Это кажется грязным, и меня интересует, как будет выглядеть правильное решение с дюрандалом.

ответ

3

В философии Дюрандаля оболочка не должна извлекать данные. Вместо этого покупка vm должна сделать это в своем обратном вызове activate (http://durandaljs.com/documentation/Creating-A-Module/). Просто удостоверьтесь, что вернули обещание от activate, если сбор билетов - операция async.

Вот пример этого шаблона, где getListCollection может либо возвращать результат кеширования (sync), либо результат async и, следовательно, завернут в $ .when(), который всегда возвращает promose.

http://www.spirit.de/demos/metro/durandalsp3/index.html#/lists

var activate = function() { 
    var self = this; 
    var webUrl = L_Menu_BaseUrl; 

    self.webUrl(webUrl); 

    logger.log('Activatíng List View', null, 'list', true); 

    return $.when(spdata.getListCollection({ webUrl: webUrl })).then(function (result) { 

     // Access to detail list information through listInfo[listName] 
     self.listInfo = result; 
     self.lists(createListVMs(result)); 

     return true; 
    }); 
}; 

обновляется на основе комментариев: Если у вас есть, чтобы получить данные в оболочке, чтобы принимать решения, есть несколько вариантов.

  • Вы могли бы рассмотреть вопрос о преобразовании на покупку виртуальной машины в виджете, как в Дюрандала 1.2 только виджеты могут иметь дополнительные данные прошли в.
  • В качестве альтернативного создать global AMD, которая возвращает синглтон и разделяется между оболочки и покупки.
  • Третий вариант заключается в том, чтобы объявить покупку как зависимой в оболочке и напрямую изменить покупку.

Подробнее см. @Joseph Gabriel Pass data in DurandalJS to other view.

+0

Спасибо Райнер. Большинство моих данных VMS обрабатывают такие данные, но в этом конкретном случае данные собираются из оболочки vm. Некоторая операция происходит в shell.js, которая дает мне данные, необходимые для покупки vm. Я не могу собрать эти данные из покупки vm, потому что результат этих данных определяет, загружена ли покупка vm. Имеет ли это смысл? – SB2055

+0

Еще раз спасибо. Какие проблемы могут использовать окно для этого? – SB2055

+0

Вы имеете в виду, кроме очевидного ';-)'? например https://gist.github.com/hallettj/64478 или http://net.tutsplus.com/tutorials/javascript-ajax/the-essentials-of-writing-high-quality-javascript/ – RainerAtSpirit

2

Вы также можете использовать пользовательские события (pub/sub style) для передачи произвольных данных между viewModels.

app.trigger('my:custom:event', message); 

app.on('my:custom:event').then(function(message){ 
    //do something with the payload 
}); 

Заканчивать the documentation для более подробной информации.

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

  • Нет связанных вопросов^_^