2013-07-05 3 views
0

У меня есть вид с сеткой, откуда я запускаю другой вид в новом окне. Родительское представление должно передать данные дочернему представлению и не может быть передано как строка запроса, так как оно довольно велико. Я не могу использовать родной модальный. Я просто с помощью window.open и не создал пользовательский модальные context.Things, что я пыталсяПередача данных между представлениями в Durandal

1. Пробовал заселение скрытых элементов поля в новом окне, используя что-то вроде кода ниже

var popup = window.open('/#/viewname'); 
popup.onload=function(){document.findbyid('hiddenfield')= newvalue }; 

Я использую страницу заставки для отображения загрузки в Дюрандал, OnLoad нового окна маршрутизатор еще навигация и я получаю всплеск страничного документа

2. Пробовал требует родительского представления в представлении ребенка, а затем захватывая данные родительского представления с использованием некоторых вещь, как код ниже

define(['viewmodels/parent'],function ('parent'){ 

function activate(){ 
localvariablevalue= parent.observable; 



} 

return{ 
activate:activate 
} 

}); 

я parent.observable как неопределенные. Скорее всего, это вне контекста, так как это новое окно.

3.Tried одноэлементно global.js файл и требуя его в обоих родителей и ребенка, но я думаю, что это также теряет контекст, как я получаю неопределенными даже с таким подходом

Любые идеи о том, как достичь этого .. если это может быть достигнуто с помощью v 1.2? Если это может быть достигнуто путем создания пользовательского модального контекста, тогда кто-то может дать некоторые указания о том, как определить функцию addContext для нового окна.

+0

Моя глупость не знает границ! Как подчеркивал дождевик в своей третьей версии win = window.open; win.targetwinvariable = значение работает просто отлично ... Нет необходимости в каких-либо сложных подходах. 2 дня в канализацию !! – shai

ответ

1

При использовании window.open создается независимый экземпляр #/viewname Создается SPA, который не имеет отношения к первому SPA. Если вам действительно нужно открыть новое окно, вам нужно будет изучить другие способы обмена информацией между окнами, например, например. localstorage.

Но вам, вероятно, лучше пересмотреть требования и посмотреть, не можете ли вы достичь цели с помощью модалов.

Редактировать на комментарий: Это не имеет ничего общего с Дурандалом, теряющим контекст, это около window.open, не открывающегося в том же сеансе. см., например, window.open doesn't open in same session

Edit2 В качестве альтернативы можно использовать из параметров #/viewname во втором окнах vm.activate для извлечения данных либо с сервера непосредственно (если это применимо), или с помощью, например, webstorage localstorage или sessionstorage из первого браузера.

Редакция 3 Я сделал быструю проверку, посмотрим, можно ли это сделать, используя только window.open. Протестировано в Firefox/Firebug. Я бы порекомендовал проверить ссылки на webstorage, чтобы убедиться, что это работает с перекрестным браузером.

Перейти к http://dfiddle.github.io/dFiddle-1.2/#/, откройте консоль и создать глобальную вар:

window.myVar = {complex: true}; 

создать новое окно

var myWindow = window.open('http://dfiddle.github.io/dFiddle-1.2/#/view-composition'); 

вернуться первую консоль и создать свойство MyVar на MyWindow

myWindow.myVar = myVar; 

перейдите на консоль второго окна и проверьте

myVar // output {complex: true} 

Альтернативой, что я предлагал использует уникальное значение хеш-функции, которые вы передаете в ко второму окну, а затем либо извлекает сложные данные (которые могут быть добавлены в строку запроса) в качестве части activate обратного вызова. Данные могут храниться на сервере или через webstorage.

+0

Так что вы говорите, что Дурандал теряет контекст? Я ошибаюсь, думая, что не модальные окна могут быть созданы, сохраняя модальный контекст, чтобы durandal знал об этом? – shai

+0

Спасибо за ваш ответ Райнер. В моем случае сеанс не может играть роли. Открытие нового окна и доступ к значениям переменной javascript. Здесь присутствует сеанс сервера .no. И window.open обычно не меняет сеанс. В вашем примере это происходит потому, что они используют встроенный элемент управления вместо браузера. На этом этапе единственное разрешение для меня, похоже, заключается в том, чтобы эмулировать новое окно, изменив модальный стиль Durandal. – shai

+0

Данные хранятся в первом окне в js var. Мне просто нужно передать его во второе окно. Итак, вы предлагаете передать его в виде строки запроса и получить его в событии активации? Если вы это не будете работать для меня, как я упоминал в своем оригинальном посте. – shai

1

Rainer благодарит за попытку помочь. Следующий код генерирует максимизированные модальности. На этом этапе я отказываюсь от этого решения и передаю свои данные в качестве активации в showModal. Это точная копия модального контекста по умолчанию с незначительными вариациями css. Но отправляйте его, если он помогает кому-то.

1. CSS

.modalHostMax { 
    top: 0px; 
    left: 0px; 
    right: 0px; 
    bottom: 0px; 
    position: fixed; 
    opacity: 0; 

    -webkit-backface-visibility: hidden; 

    -webkit-transition: opacity 0.1s linear; 
    -moz-transition: opacity 0.1s linear; 
    -o-transition: opacity 0.1s linear; 
    transition: opacity 0.1s linear; 
} 
.modalMax { 

    width: 100%; 
    height: 100%; 


} 

2.New модальный контекст

var addContext = function (contextName) { 
      modalDialog.addContext(contextName, { 
       blockoutOpacity: .2, 
       removeDelay: 200, 
       addHost: function (modal) { 
        var body = $('body'); 
        var blockout = $('<div class="modalBlockout"></div>') 
         .css({ 'z-index': modalDialog.getNextZIndex(), 'opacity': this.blockoutOpacity }) 
         .appendTo(body); 

        var host = $('<div class="modalHostMax"></div>') 
         .css({ 'z-index': modalDialog.getNextZIndex() }) 
         .appendTo(body); 

        modal.host = host.get(0); 
        modal.blockout = blockout.get(0); 

        if (!modalDialog.isModalOpen()) { 
         modal.oldBodyMarginRight = $("body").css("margin-right"); 

         var html = $("html"); 
         var oldBodyOuterWidth = body.outerWidth(true); 
         var oldScrollTop = html.scrollTop(); 
         $("html").css("overflow-y", "hidden"); 
         var newBodyOuterWidth = $("body").outerWidth(true); 
         body.css("margin-right", (newBodyOuterWidth - oldBodyOuterWidth + parseInt(modal.oldBodyMarginRight)) + "px"); 
         html.scrollTop(oldScrollTop); // necessary for Firefox 
         $("#simplemodal-overlay").css("width", newBodyOuterWidth + "px"); 


        } 


       }, 
       removeHost: function (modal) { 
        $(modal.host).css('opacity', 0); 
        $(modal.blockout).css('opacity', 0); 

        setTimeout(function() { 
         $(modal.host).remove(); 
         $(modal.blockout).remove(); 
        }, this.removeDelay); 

        if (!modalDialog.isModalOpen()) { 
         var html = $("html"); 
         var oldScrollTop = html.scrollTop(); // necessary for Firefox. 
         html.css("overflow-y", "").scrollTop(oldScrollTop); 
         $("body").css("margin-right", modal.oldBodyMarginRight); 
        } 
       }, 
       afterCompose: function (parent, newChild, settings) { 

        var $child = $(newChild); 
        var width = $child.width(); 
        var height = $child.height(); 



        $child.attr('class', 'modalMax'); 
        $(settings.model.modal.host).css('opacity', 1); 

        if ($(newChild).hasClass('autoclose')) { 
         $(settings.model.modal.blockout).click(function() { 
          settings.model.modal.close(); 
         }); 
        } 

        $('.autofocus', newChild).each(function() { 
         $(this).focus(); 
        }); 
       } 
      }); 
     }; 

3. В вашей целевой точки зрения, убедитесь, что контейнер мин-высота устанавливается в $ (документ) .height()

4. Чтобы использовать только заданный пользовательский контекст, вызывая addContext ('yourcontextname'). Затем создайте свой modal - app.showModal ('viewname', {data}, 'yourcontextname')

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