據我所知,在Durandal應用程序中,在視圖模型之間傳遞參數的唯一無縫方法是使用正常的基於散列的url參數。
在您例如,您可以定義一個路由器,需要一個訂單ID和repairOrder參數,那麼你的URL會是這個樣子:http://localhost:60312/#/page/2/2
這是最好的選擇,如果你的數據是不是太敏感了。保持導航參數處於打開狀態,並在第二個視圖模型中小心處理值。換句話說,設計視圖模型以便它可以正確處理任何值 - 即使用戶直接修改參數值,視圖模型也應該能夠正確處理它。
能夠直接設置url參數是有好處的,但在使用這些參數之前必須小心確保值的完整性。
然而,如果你需要隱藏的參數,你有一些不同的選擇:
加密:使用加密庫像tea.js,並添加它作爲一個參數值之前加密值導航。然後,當然,在使用它之前在第二頁解密它。這允許Durandal的router
導航正常工作,同時防止用戶提供自己的值。
如果您確實需要防止用戶輸入自己的值,並且您可以承擔額外KB的開銷,那麼只要您只需傳遞一些參數即可。
共享數據模型:使用在兩個視圖模型之間共享的單例模型。根據需要,此模型可以手動設置爲required()
,並且本質上充當一個或多個視圖模型之間共享的應用程序狀態的存儲庫。 這工作正常,但它有點像一個大的全局變量 - 如果過度使用它可能會變得混亂。
修改虛擬機直接:(僅適用於單視圖模型) 手動require()
第二視圖模型並導航到之前設置其屬性。
謝謝,這給了我很多正確的方向。我想知道是否也可以在路由器中添加額外的數據,當它從視圖A轉到B時,比如說把它放在routeinfo.settings中? – 2013-05-03 13:16:12
不幸的是,加密url參數並不會阻止用戶按照自己的意願更改值。他們仍然可以使用自己的加密庫,並根據需要將任何加密的數據傳遞給url。即使他們不能,他們仍然可以輕易地污染你的視圖模型。 – 2013-09-06 22:43:14
@JaniHyytiäinen,你是對的,可能值得指出。但是,值得一提的是,所有這些方法都受到用戶的操縱 - 應用程序以JS運行,沒有辦法完全防止用戶修改客戶端數據和/或執行流程的可能性。這就是爲什麼它必須確保在信任來自客戶端的數據之前,在服務器端執行任何關鍵參數驗證或業務邏輯。客戶端邏輯是可選的,服務器端不是。 – 2013-09-09 11:33:08