2011-11-02 52 views
9

將呈現頁面(即JSON數據或配置變量)中的引導變量傳遞到require.js的最佳做法是什麼,以便可以檢查依賴關係使用的變量?將引導變量和JSON傳遞給require.js

它看起來像這可以通過檢查window對象(即window.bootstrapped_models做,但似乎並不十分最佳

app.html - 例如數據的HTML文檔

<script> 
var config = { 
    "isAdmin": true, 
    "userId": 1 
}; 
var bootstrapped_models = { 
    "groups": [ 
     { 
      "id": 1, 
      "name": "Foo" 
     }, 
     { 
      "id": 2, 
      "name": "Bar" 
     } 
    ] 
} 
</script> 

app.js內 - 示例應用程序使用要求()

require(['jquery', 'GroupCollection'], function($, GroupCollection) { 

    // extend default config 
    if (config) { 
     $.extend(defaults, config); 
    } 

    // use bootstrapped JSON here 
    var collection = new GroupCollection; 
    if (bootstrapped_models.groups.length > 0) { 
     collection.add(bootstrapped_models.groups); 
    } 

}); 

回答

0

不知道我的方法是否最好practi CE但我做的東西很多像你正在做的,除了代替全局對象用頭撞自舉模式是什麼,我創建了一個在我的HTML頁面中定義它:

<script type="text/javascript"> 
    define("bootstrappedModelJson", function() { 
     return @Html.Action("Controller", "RenderModel"); 
    }); 

    require({ 
     baseUrl: //etc. 
    }, ["app"], 
    function(){ 

    }); 
</script> 

然後我有一個js文件名爲current.model這可以由其他模塊需要,看起來像這樣:

define(
[ 
    'require', 
    'model' 
], 
function (require, Model) 
{ 
    var json= require("bootstrappedModelJson"); 

    return new Model(json); 
}); 
6

@timDunham的答案是有幫助的,但它對我來說有點過於複雜。玩弄require.js和鋰(PHP MVC)我想出了以下內容。這很簡單,並且在我碰到的每個例子中都有效。

<script type="text/javascript"> 
define('bootstrapData', function() { 
    return <?php echo json_encode($bootstrapData) ?>; 
}); 
</script> 

,然後通過執行以下操作可用:

define(['bootstrapData'], function(bootstrapData) { 
    console.log(bootstrapData); // Will output your bootstrapped object 
}); 

很顯然,我帶來了數據的方式是特定的語言,但剩下的應該是有用的,無論你的情況。

+0

感謝。你的代碼真的有幫助 –

+1

我無法得到這與優化我的js工作...我嘗試使用excludeShallow與boostrapData模塊,但是當我去編譯它仍然試圖找到一個bootstrapData文件。任何人都可以解釋他們是如何運作的?我對require.js非常陌生。另外,我正在使用require版本1.0.1(以防有所作爲) –

0

可以解決問題與優化/在你的build.js 像這種禁用bootstrapData建設:

paths: { 
    bootstrapData: "empty:",