2

我在閱讀關於Backbone的文章時發現的共識似乎是:不要在視圖中存儲東西,將其存儲在模型中,然後讓視圖監聽模型上的更改。跟蹤視圖狀態信息的推薦方式是什麼?

如果我們談論的情況是,我們已經有了明顯的模型 - 視圖配對,這非常棒。例如,您有一個用戶模型和一個UserView視圖。很明顯,你在視圖上設置了一個模型屬性,它監聽模型的變化。

然而,假設我有一個視圖,顯示了一個東西的列表,並且有兩個按鈕可以在「列表視圖」和「網格視圖」之間切換。這是我在應用程序和網站中看到的一個非常常見的約定。我是否想要「列表視圖」或「網格視圖」與模型/集合本身無關;這個觀點本身似乎非常具體。

起初我只是嘗試使用完全像模型的視圖:設置屬性,綁定事件'change:propertyName',然後使用someView.set('propertyName')等等來更新它......但這不起作用。

一邊想着如何處理這個,我以爲我記得看到這樣的事情之前:

var MyView = Backbone.View.extend({ 
    ... 
    model: Backbone.Model(), 
    ... 
}); 

因此,與有,比方說,一個的usermodel ..我們只是有一些「無類型」的模式。或者我想,我實際上可以創建一個新的課程,也許只是爲了這個,我稱MyViewModel ...雖然我沒有看到一個理由。

這允許我像我想要的那樣綁定到更改事件並使用someView.model.set(...)設置視圖數據。

所以我的問題是:這是人們在Backbone中爲視圖狀態做的常見事情嗎?或者,還有更好的方法?謝謝。

回答

2

您是否希望在用戶訪問該頁面時使用所選的顯示樣式(列表與網格)?如果是這樣,最簡單的解決方案可能是將該狀態存儲在localStorage中,並讓視圖類直接訪問它。

如果你不需要當前的顯示風格被記住,那麼也許你根本不需要存儲狀態。單擊按鈕時風格發生變化。當頁面刷新時,它將返回到默認值。

如果您的應用程序已登錄有帳戶的用戶,並希望他們的選擇跨他們使用的所有設備都堅持,你需要有像一個UserModel(其中有已登錄用戶的信息和偏好)記錄他們的選擇並將其保存到服務器。您的視圖可以偵聽此模型的更改。

Backbone的美(對我來說)是沒有一個正確的方法去做某件事。這些想法只是一些可以處理它的方法。

您也可以在集合上擁有displayStyle屬性。我從可排序的表中得到這個想法:在這種情況下,排序元數據是集合對象的一部分。當您通過選擇列標題來改變表格時,您可以更改集合的comparator並對其進行處理。該視圖將偵聽「排序」事件,並在發生時重新渲染。你可以爲顯示風格做類似的事情(你可以通過在你的收藏中做this.trigger('display-style')並讓視圖監聽該事件來創建自己的事件)。

最後,無論你決定管理該狀態,你應該考慮這應該全部是一個視圖類還是多個視圖類。我認爲這將取決於應用程序的複雜性。在很多情況下,例如ProductListViewProductGridView可能會更好,而不是帶有兩種顯示樣式的單個ProductView。將它們拆分爲不同的視圖可能會使未來更容易添加其他樣式(ProductImageView,也許?)。

相關問題