Requirejs 在Durandal中的视图之间传递数据

Requirejs 在Durandal中的视图之间传递数据,requirejs,durandal,Requirejs,Durandal,我有一个带有网格的视图,从中我在新窗口中启动了一个不同的视图。父视图需要将数据传递给子视图,并且不能作为查询字符串传递,因为它非常大。我不能使用本机模态。我只是在使用window.open,还没有创建自定义模式上下文。我尝试过的东西 1。尝试使用下面的代码填充新窗口中的隐藏字段元素 var popup = window.open('/#/viewname'); popup.onload=function(){document.findbyid('hiddenfield')= newvalue }

我有一个带有网格的视图,从中我在新窗口中启动了一个不同的视图。父视图需要将数据传递给子视图,并且不能作为查询字符串传递,因为它非常大。我不能使用本机模态。我只是在使用window.open,还没有创建自定义模式上下文。我尝试过的东西

1。尝试使用下面的代码填充新窗口中的隐藏字段元素

var popup = window.open('/#/viewname');
popup.onload=function(){document.findbyid('hiddenfield')= newvalue };
define(['viewmodels/parent'],function ('parent'){

function activate(){
localvariablevalue= parent.observable;



}

return{
activate:activate
}

});
我使用一个启动页来显示durandal中的加载,路由器仍在导航的新窗口的加载,我得到启动页文档

2。尝试在子视图中要求父视图,然后使用下面的代码获取父视图数据

var popup = window.open('/#/viewname');
popup.onload=function(){document.findbyid('hiddenfield')= newvalue };
define(['viewmodels/parent'],function ('parent'){

function activate(){
localvariablevalue= parent.observable;



}

return{
activate:activate
}

});
我把parent.observable当作未定义。这很可能是断章取义的,因为这是一个新窗口

3.尝试了一个singleton global.js文件,并要求在父级和子级中都使用它,但我认为这也会丢失上下文,因为即使使用这种方法,我也无法定义它


关于如何实现这一点有什么想法吗。。是否可以使用V1.2实现?如果可以通过创建自定义模式上下文来实现,那么有人可以提供一些关于如何为新窗口定义addContext函数的指针。

使用
窗口。打开
创建与第一个SPA无关的
#/viewname
SPA的独立实例。如果你真的需要打开一个新窗口,那么你需要寻找其他方式在窗口之间交换信息,例如

但是你最好重新考虑一下需求,看看你是否能用情态动词来实现这个目标

根据评论进行编辑:这与Durandal放松上下文无关,而是关于
窗口。打开
而不是在同一会话中打开。见例

Edit2作为替代方法,您可以在第二个windows
vm中使用param
#/viewname
。激活
,直接从服务器(如果适用)或通过第一个浏览器的localstorage或sessionstorage等方式检索数据

Edit3我做了一个快速测试,看看是否可以使用
窗口完成。单独打开
。在Firefox/Firebug中测试。我仍然建议签出链接,以确保跨浏览器工作

转到,打开控制台并创建全局变量:

window.myVar = {complex: true};
创建一个新窗口

var myWindow = window.open('http://dfiddle.github.io/dFiddle-1.2/#/view-composition');
返回第一个控制台并在myWindow上创建属性myvar

myWindow.myVar = myVar;
切换到第二个窗口的控制台并检查

myVar // output {complex: true}

我建议的替代方法是使用传递到第二个窗口的唯一哈希值,然后作为
activate
回调的一部分检索复杂数据(可以作为查询字符串添加)。数据可以存储在服务器上或通过Web存储。

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.新的模态上下文

   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();
                    });
                }
            });
        };
var addContext=function(contextName){
modalDialog.addContext(contextName{
blockoutOpacity:.2,
移除时间:200,
addHost:函数(模态){
变量body=$('body');
变量封锁=$('')
.css({'z-index':modalDialog.getNextZIndex(),'opacity':this.blockoutOpacity})
.附于(正文);
变量主机=$(“”)
.css({'z-index':modalDialog.getNextZIndex()})
.附于(正文);
modal.host=host.get(0);
modal.blockout=blockout.get(0);
如果(!modalDialog.isModalOpen()){
modal.oldBodyMarginRight=$(“正文”).css(“右边距”);
var html=$(“html”);
var oldboyouterwidth=body.outerWidth(true);
var oldcollScrollTop=html.scrollTop();
$(“html”).css(“溢出”、“隐藏”);
var newbodyyouterwidth=$(“body”).outerWidth(true);
css(“右边距”(newbodyyouterwidth-oldboyouterwidth+parseInt(modal.oldboymarginright))+“px”);
html.scrollTop(oldScrollTop);//对于Firefox来说是必需的
$(“#simplemodal覆盖”).css(“宽度”,newBodyOuterWidth+“px”);
}
},
removeHost:功能(模式){
$(modal.host).css('opacity',0);
$(modal.blockout).css('opacity',0);
setTimeout(函数(){
$(modal.host).remove();
$(modal.blockout).remove();
},这个。删除了);
如果(!modalDialog.isModalOpen()){
var html=$(“html”);
var oldcollScrollTop=html.scrollTop();//是Firefox所必需的。
css(“overflow-y”,”).scrollTop(oldScrollTop);
$(“body”).css(“右边距”,modal.oldbody右边距);
}
},
afterCompose:函数(父级、新子级、设置){
变量$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.bl)