在dojo中将值从一个页面传递到另一个页面

时间:2014-02-07 17:09:04

标签: dojo

我有一个在dojo中设计的独立页面(page1.htm),它有几个过滤器和一个网格。在输入过滤网格中的值时,将填充值。 现在我必须开发另一个页面(page2.htm),其中有一个网格。 现在,当用户点击网格中的一行时,我需要将值(与page1的过滤器相同)从此处传递到page1,并根据page2.htm传递的值填充网格。

请告诉我如何实现这一目标

1 个答案:

答案 0 :(得分:0)

有很多方法可以做到这一点,但我认为在大多数情况下,最简单的方法是将值作为URL参数传递。

重要的是你要意识到这与Dojo没有任何关系。这是标准的基本Web浏览器功能。也就是说,Dojo确实有一个你可能会发现有用的模块:dojo/io-query(我假设你使用的是最近版本的Dojo)。

假设您的page1.htm有一个名为rowClicked的函数,在单击网格行时会调用该函数。在此函数中,您获取page2.htm所需的值,然后告诉浏览器打开page2.htm,并将值作为URL参数附加。

var rowClicked = function() {
    var someValue = getSomeValue(),
        someArray = [ 13, 42 ];

    window.location.replace('./page2.htm?someValue=' + someValue + 
                                       '&someArray=' + someArray[0] + 
                                       '&someArray=' + someArray[1]);
};

如果你有很多价值,这可能有点麻烦。让我们改用Dojo的io-query:

require([/*..your other dependencies..,*/ "dojo/io-query"],
    function(/*..other dependencies..,*/ ioQuery) {

    //.. your other code ..
    var rowClicked = function() {
        var values = {
            someValue: getSomeValue(),
            someArray: [ 13, 42 ]
        };

        window.location.replace('./page2.htm?' + 
                                ioQuery.objectToQuery(values));
    };
    // ....

在page2.htm上,假设在加载页面时调用了一个名为loadValues的函数。在这个函数中,我们从URL参数中获取值,并用它们做我们需要的任何事情。我们再次使用Dojo的io查询。 (但请记住,您可以轻松地在没有任何库的情况下执行此操作!请参阅此答案以获取一些想法:How can I get query string values in JavaScript?

var loadValues = function() {
    var page1Values= ioQuery.queryToObject(window.location.search.slice(1));
    console.log("Here are the values: ", 
                page1Values.someValue,
                page1Values.someArray[0],
                page1Values.someArray[1]);
};

(当然,您必须先在代码中加载dojo/io-query。)

在上面的示例中,我们使用了URL参数将值从page1发送到page2。请求page2时,URL参数将发送到服务器,因此它们可能会与URL中的其他参数发生冲突。

将值传递给page2的另一种方法是在使用浏览器位置的同时使用它的“哈希”部分。发现微小的差异:

your.site/page2.htm?someValue=abc&someArray=13&someArray=42 // URL parameters
your.site/page2.htm#someValue=abc&someArray=13&someArray=42 // hash part

第二行中的参数不会发送到服务器。正如您所期望的那样,对上面代码的更改将非常小。在page1.htm上,将window.location行替换为:

window.location.replace('./page2.htm#' + 

..并在第2页上,将window.location行更改为:

var page1Values= ioQuery.queryToObject(window.location.hash);