2012-12-19 52 views
2

一些背景:我來自.Net環境,我們必須在所有項目中使用MVVM將視圖與視圖模型分開。現在我正在開發自己的個人PHP項目,我決定使用相同的設計,並將視圖和視圖模型分開。有沒有什麼辦法可以在我的PHP MVVM設計中使用jQuery?

因此,在視圖中,我創建了一個viewmodel對象並在必要時調用後臺函數,並且在視圖中代碼僅用於提供顯示。

例子:

view.php

<?php 
include('viewmodel.php'); 

$vm = new viewmodel.php(); 

if(some condition) 
{ 
    $vm->doSomething(); 
} 
?> 
<html> 
<body> 
//some form code 
</body> 
</html> 

viewmodel.php

<?php 
//includes 

class viewmodel 
{ 
    function viewmodel() 
    { 
    } 

    function doSomething() 
    { 
    } 
} 
?> 

現在,我已經瞭解了jQuery我想用它來使我的網頁更有活力,有減少來往服務器的流量,減少頁面刷新的需求。

我見過調用像這樣,讓jQuery來調用PHP頁面與一些後期的一些數據:

$.ajax({ url: '/my/site', 
     data: {action: 'test'}, 
     type: 'post', 
     success: function(output) { 
         alert(output); 
        } 
}); 

然而,這不再是面向對象設計,我不得不刪除所有的類定義從我的viewmodels這個工作。

是否有任何方法讓jQuery將這些調用視圖模型或使用jQuery意味着您必須返回到過程式編程風格?

回答

4

但是,這不再是面向對象的設計,我必須從我的viewmodels中刪除所有的類定義才能工作。

是什麼讓你覺得呢?關於向服務器發送AJAX請求沒有內在的面向對象或非面向對象的內容。這些客戶端請求也不會影響服務器端代碼的體系結構。

在您的意見中,您可以擁有任何您想要的JavaScript代碼。它不會影響呈現視圖的服務器端代碼,因爲就其而言,JavaScript只是文本而已,與HTML沒有區別。

至於服務器端處理程序,您可能要做的是爲jQuery代碼調用的「頁面」(「資源」更準確的詞)創建全新的視圖和視圖模型。

因此,例如,您可能會從瀏覽器獲取類似/my/site的請求,使用您已有的體系結構填充視圖模型以綁定到視圖並將該視圖返回給客戶端。該視圖將包含一些JavaScript代碼,其中一些調用另一個資源。假設其他資源類似/api/products,它返回用戶可用的「產品」列表。

請注意,我把資源置於不同的路徑,api而不是my。這是一個相當武斷的決定,它只是用來說明你在這種情況下返回的內容不是一個「頁面」,而是一個自動API的JSON數據。當然,資源的實際名稱可以是任何你喜歡的。

此資源仍然可以是視圖並被綁定到視圖模型,但在這種情況下,視圖是JSON數據而不是HTML。與任何事情一樣,有很多方法可以做到這一點。一個快速的谷歌搜索出現了another question,它討論了幾種生成JSON數據的方法之間的區別。事實上,在這種情況下,您的「視圖」可能完全是空的,您所做的只是將視圖模型序列化爲JSON並將其返回。 (我的PHP是非常生疏,但ASP.NET MVC相當於將返回,而不是View()Json()ActionResult

請記住,從服務器端代碼的角度來看,沒有什麼區別返回HTML中的視圖與使用JSON(或XML,或原始文本或其他)返回視圖之間的關係。視圖是一個視圖,每個視圖都獨立於其他視圖。

+0

'你是怎麼想的?'我指的是我稱之爲viewmodel函數'$ vm-> doSomething'的方式。我無法使用jQuery進行此調用。因此,如果我想在用戶點擊提交按鈕後使用jQuery來調用我的registerUser函數,我現在無法按照我現在編碼的方式進行操作。 –

+0

'「使用jQuery來調用我的registerUser函數」 - 你可能會在這裏穿過這個術語。 jQuery不會調用PHP函數。 PHP運行服務器端,JavaScript運行客戶端。這兩者完全相互斷開。 jQuery會做的是調用一個單獨的「頁面」並接收響應。 PHP代碼如何生成該響應(例如,使用MVVM模式)完全超出了jQuery代碼的功能或甚至知道的範圍。 jQuery代碼會請求一個服務器端資源,它可以在發送響應之前在內部執行一些PHP代碼。 – David

+0

好的,是的,我想我在服務器端和客戶端混淆了。我真的希望我不必改變太多,但我現在知道,如果我想使用jQuery,我將不得不作出一些改變。謝謝 –

相關問題