2012-06-02 34 views
3

如何在不創建全局變量的情況下從外部JavaScript文件中的PHP變量訪問JSON數組?PHP Var到外部JS - 沒有Global,Ajax或Eval

我有一個包含json_encoded陣列中的PHP變量$客戶:

$customers = [{"id":"12","name":"Abe Adams"},{"id":"17","name":"Bill Brown"}] 

我想用數組的內容在一個jQuery UI自動完成文字輸入。

我不希望爲自動填充選項發出Ajax請求,而是希望使用$ customers數組中的值,這些值傳入並在用戶到達頁面時準備好。

我知道我可以通過$客戶的內容JavaScript變量加載外部之前JavaScript文件:

<script>var customers = <?php echo $customers; ?></script> 
<script src="external.js"></script> 

但是這需要創建一個全局JavaScript變量。

有沒有更好的方式從我的外部JS文件訪問$ customers數組?


這個問題已經被問了幾次前面:

問:Access PHP var from external javascript file 接受的答案:Create global var

問:Pass vars from php to js without ajax 頂端回答:Use Ajax

問:php file send variable to .js external file 頂端回答:Use Ajax

問:Reading a PHP file variables from external JS 頂端回答:Use eval

問:Return JSON data from PHP, and use it using Javascript 接受的答案:Create global var

+0

如果您使用的是自動完成插件,那麼您不需要存儲該json,將'source'設置爲自動完成,它將檢索數據。 – thecodeparadox

+0

@thecodeparadox - 你能告訴我你的意思嗎?在jQuery文檔中沒有看到將源設置爲自動完成的任何內容,並且不確定它將如何知道在哪裏查找。如果這確實起作用的話,那將很棒。 – cantera

回答

1

你也可以使用一個requirejs 「模式」:

external.js:

define([], { 
    init: function (customerData) { 
     ... all your setup 
    } 
}); 

在頁面:

require(['external'], function (externalSetupFile) { 
    var customers = <?php echo $customers?>; 
    externalSetupFile.init(customers); 
}); 

的一大好處(一般),其具有某種引發網站增強的「init」方法是你可以做這樣的事情。例如:

Application = { 
    init: function (bootstrapData) { 
     UserModel.create(bootstrapData.userModelData); //for example 
     this.config = bootstrapData; 
     this.setupUI(); 
    }, 
    setupUI: function() { 
     //setup autocomplete and the like 
     $("#someEl").autocomplete(this.config.customers); 
    } 
} 

這方面的一個更好的是,你可以先分割你在做什麼成小部分,這使得測試和調試的方便很多赫克。

+0

謝謝Stephen - 這真棒。我只用了一點RequireJS - 你知道這個模式在哪裏被記錄或者任何解釋它的教程嗎?另外,空數組在define()參數中表示什麼? – cantera

+0

這是我從單頁應用程序中獲得的各種東西的混搭。空陣列是沒有必要的。我把它添加出習慣,因爲我工作的大多數模塊在一定程度上是相互依賴的。無論如何,'模式'真的是更多的東西,你可以從Java和類似的東西..有一個「主」功能,讓應用程序啓動和運行。這樣,你可以專門控制什麼時候開始,什麼開始(即從頁面獲取數據與ajax調用vs jsonp調用等)。 – Stephen

+0

我回溯了一些我的書,但無法確定一個具體的例子 - 但如果您有興趣,我會強烈推薦http://www.amazon.com/JavaScript-Patterns-ebook/dp/B0046RERXE(它給出了一些好的食物) – Stephen

2

不,你不能這樣做,未做external.js是一個動態生成的。然而,你可以稍微改善你的策略。而不是一個全局命名customers有過連接所有的全局變量全局對象:

window.Globals = {}; 
Globals.customers = <?php echo $customers; ?>; 
Globals.something_else = <?php echo $something_else; ?> 

不要將其命名Globals雖然。將它命名爲特定於您的公司或網站應用/網站的內容。這樣,您將極大地降低與任何外部腳本相沖突的變量名稱的風險,因爲您只有一個使用的全局變量,並且它是根據特定於您的站點的名稱命名的。

+0

謝謝 - 我喜歡這種用於管理全局變量的策略,並且不認爲我之前看到過這樣做。還會細讀其他一些回覆 - 我猜你已經發布了其他有用的JS技巧。 – cantera

+0

不客氣@ cantera25,隨時查看:)雖然我不認爲有任何特別JS技巧的帖子,而不是特定問題的答案。 – Paulpro

0

我想你可以實現這一點,如果你嘗試使用自動完成插件。

$("#some_input_field").autocomplete("search.php", { 
    // your code 
}); 

,或者你可以做的也

$("#some_input_field").autocomplete({ 
    source: "search.php", 
    // some other code 
}); 

這裏source.php將會從您加載數據替換URL。