2013-05-03 68 views
1

我正在開發一個SPA webapplicationDurandalJS,但我不明白。將DurandalJS的數據傳遞到其他視圖

假設我有page 12。在page 1上有一種模式,在database中用BreezeJS創建一個實體,並返回一個鍵(在數據庫中生成)。

我想通過這個取出的密鑰,然後去我的第二頁,第2頁。我知道我能做到這一點,當我把它的URL

http://localhost:60312/#/page2?orderid=2&repairorder=2 

但這不是了道路Durandal,還是它?用戶可以輸入一些他自己的後果!

我該如何解決這個問題?

回答

5

據我所知,在Durandal應用程序中,在視圖模型之間傳遞參數的唯一無縫方法是使用正常的基於散列的url參數。
在您例如,您可以定義一個路由器,需要一個訂單ID和repairOrder參數,那麼你的URL會是這個樣子:http://localhost:60312/#/page/2/2

這是最好的選擇,如果你的數據是不是太敏感了。保持導航參數處於打開狀態,並在第二個視圖模型中小心處理值。換句話說,設計視圖模型以便它可以正確處理任何值 - 即使用戶直接修改參數值,視圖模型也應該能夠正確處理它。

能夠直接設置url參數是有好處的,但在使用這些參數之前必須小心確保值的完整性。

然而,如果你需要隱藏的參數,你有一些不同的選擇:

加密:使用加密庫像tea.js,並添加它作爲一個參數值之前加密值導航。然後,當然,在使用它之前在第二頁解密它。這允許Durandal的router導航正常工作,同時防止用戶提供自己的值。

如果您確實需要防止用戶輸入自己的值,並且您可以承擔額外KB的開銷,那麼只要您只需傳遞一些參數即可。

共享數據模型:使用在兩個視圖模型之間共享的單例模型。根據需要,此模型可以手動設置爲required(),並且本質上充當一個或多個視圖模型之間共享的應用程序狀態的存儲庫。 這工作正常,但它有點像一個大的全局變量 - 如果過度使用它可能會變得混亂。

修改虛擬機直接:(僅適用於單視圖模型) 手動require()第二視圖模型並導航到之前設置其屬性。

+1

謝謝,這給了我很多正確的方向。我想知道是否也可以在路由器中添加額外的數據,當它從視圖A轉到B時,比如說把它放在routeinfo.settings中? – 2013-05-03 13:16:12

+0

不幸的是,加密url參數並不會阻止用戶按照自己的意願更改值。他們仍然可以使用自己的加密庫,並根據需要將任何加密的數據傳遞給url。即使他們不能,他們仍然可以輕易地污染你的視圖模型。 – 2013-09-06 22:43:14

+0

@JaniHyytiäinen,你是對的,可能值得指出。但是,值得一提的是,所有這些方法都受到用戶的操縱 - 應用程序以JS運行,沒有辦法完全防止用戶修改客戶端數據和/或執行流程的可能性。這就是爲什麼它必須確保在信任來自客戶端的數據之前,在服務器端執行任何關鍵參數驗證或業務邏輯。客戶端邏輯是可選的,服務器端不是。 – 2013-09-09 11:33:08

8

我想添加一些非常好的@Joseph Gabriel答案。在迪朗達爾你可以這樣做:

router.map(url: 'page2/:orderid/:repairorder', 
      name: 'Page2', 
      moduleId: 'viewModels/page2'); 

http://localhost:60312/#/page/2/2 

但同時,你可以這樣做:

router.map(url: 'page2', 
      name: 'Page2', 
      moduleId: 'viewModels/page2'); 

http://localhost:60312/#/page2?orderid=2&repairorder=2 

你不NEDD指定所有您所考取的參數。喲可以從活動方法的輸入中獲取這個參數。

var activate = function(context) { 
    console.log(context.orderid); 
    console.log(context.repairorder); 
} 

有時第二個解決方案可以,如果你想用戶可以存儲網址重複的查詢只在逃避,在瀏覽器中更佔有。