<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                --- title: 會話(Session) slug: the-session date: 0005/01/02 number: 5.5 points: 5 sidebar: true photoUrl: http://www.flickr.com/photos/philmosby/11372421963/ photoAuthor: Phil Mosby contents: 學習關于 Meteor 的會話(Session)|學習自動運行函數|學習動態代碼重載(Hot Code Reload) paragraphs: 33 --- Meteor 是一個響應式框架。這意味著隨著數據的變化, App 的改變并不需要你顯式地做任何事情。 事實上,我們已經看到過我們的模板是如何根據數據和路由規則的變化去進行改變的。 我們將在后面的章節去深入了解這里面是如何工作的,但我們現在想介紹一些基本的響應性功能,它對于普通的 App 是非常有用的。 ### Meteor 的會話(Session) 現在在 Microscope 下,用戶在 App 中的當前狀態是完全包含在 URL 里面,并且需要從 URL (或者數據庫)里面尋找。 但是在許多情況下,你需要存儲一些只對應于當前用戶的應用程序版本的短暫狀態(例如,一個元素是否顯示或隱藏)。利用 Session 可以很方便地去做到這一點。 Session 是一個全局的響應式數據存儲。它全局性的意思是全局的單例對象:這個 Session 對象在全局都是可被訪問到。全局變量通常被認為不是一件什么好事,不過在剛才的例子上,Session 可以作為中央通信總線用于項目的不同地方。 ### 修改會話(Session) 會話 `Session` 是全局可訪問的。設置一個 Session 的值,你可以調用: ~~~js ? Session.set('pageTitle', 'A different title'); ~~~ <%= caption "瀏覽器控制臺(Browser console)" %> 通過 `Session.get('mySessionProperty');` 你可以重新讀取數據的內容,這是一個響應式的數據源,這意味著如果你把它放在一個 Helper 里面,你會看到 Helper 根據 Session 變量的改變而響應式地改變它的輸出。 讓我們試一試,將下面的代碼添加到布局模板: ~~~html <header class="navbar navbar-default" role="navigation"> <div class="navbar-header"> <a class="navbar-brand" href="{{pathFor 'postsList'}}">{{pageTitle}}</a> </div> </header> ~~~ <%= caption "client/templates/application/layout.html"%> ~~~js Template.layout.helpers({ pageTitle: function() { return Session.get('pageTitle'); } }); ~~~ <%= caption "client/templates/application/layout.js"%> <% note do %> ### 關于附錄(Sidebar)的代碼 請注意在附錄章節中的代碼并不是本書主流程的一部分。所以要么創建一個新分支(如果你使用 Git),要么確保在本章結束后恢復你所做的改動。 <% end %> Meteor 的自動重載(即使用后面講到的“動態代碼重載技術”(HCR)的頁面自動刷新)會保存 Session 的變量,所以我們現在應該看到“不同的標題”顯示在導航欄中。如果不是,再次輸入之前的 `Session.set()` 命令。 另外,如果我們去更改它的值(再次在瀏覽器控制臺中),我們應該看到另一個標題顯示: ~~~js ? Session.set('pageTitle', 'A brand new title'); ~~~ <%= caption "Browser console" %> 由于 Session 的全局可訪問性,所以這些變化可以作用到應用程序的任何地方。這給了我們很大的權力,但如果使用太多也可以是一個陷阱。 另外,重點指出的是 Session 對象*不在*用戶之間共享,甚至在瀏覽器標簽之間。這就是為什么如果現在你在新瀏覽器標簽打開你的應用,你會看到一個空網站標題。 <% note do %> ### 相同的變化 如果你通過 `Session.set()` 去修改一個 Session 變量,并將其修改為相同的值,Meteor 會非常聰明的繞過繁瑣的操作,避免不必要的方法調用。 <% end %> ### 自動運行(Autorun) 我們看到響應式數據源的一個例子,并且看到了它在一個模板 Helper 里面的運作。盡管某些情況下 Meteor(如模板 Helper)是響應式的,但是大部分的 Meteor App 仍然是基于普通的非響應式的 JavaScript 代碼。 讓我們假設有以下的代碼片段在我們的 App: ~~~js helloWorld = function() { alert(Session.get('message')); } ~~~ 盡管我們調用一個響應式會話(Session)變量,但它并不是在響應式的*上下文*中調用,所以當改變這個 Session 變量的時候,我們也不會自動運行 `alert` 函數。 這個時候,就要引入[自動運行(Autorun)](http://docs.meteor.com/#Tracker_autorun)機制了。顧名思義,每一次 `autorun` 上下文中的響應式數據源發生變化的時候,`autorun` 函數就會自動運行。 嘗試到瀏覽器控制臺輸入: ~~~js ? Tracker.autorun( function() { console.log('Value is: ' + Session.get('pageTitle')); } ); Value is: A brand new title ~~~ <%= caption "瀏覽器控制臺(Browser console)" %> 如你所料,放在 `autorun` 函數里面的代碼將會運行一次,把數據輸出到控制臺。現在,讓我們嘗試去改變標題: ~~~js ? Session.set('pageTitle', 'Yet another value'); Value is: Yet another value ~~~ <%= caption "瀏覽器控制臺(Browser console)" %> 神奇吧!隨著 Session 變量的改變, `autorun` 知道它必須重新運行自己的代碼,并把新的值重新輸出到控制臺。 所以我們回到之前的例子,如果希望每次 Session 變量發生變化的時候引發新的警報(`alert`),我們需要做的就是將我們的代碼封裝在 `autorun` 函數里面: ~~~js Tracker.autorun(function() { alert(Session.get('message')); }); ~~~ 正如我們前面看到的,`autorun` 會自動跟蹤響應式數據源,在它們變化的時候作出響應的反應。 ### 動態代碼重載技術(Hot Code Reload) 在 Microscope 的開發過程中,我們已經用過 Meteor 的動態代碼重載技術(HCR)去節省時間:當我們修改并保存一個源代碼的文件后,Meteor 會立刻檢測到變化,直接重啟正在運行的 Meteor 服務器,并通知每個客戶端重新加載該頁面。 這類似于頁面的自動刷新,但有一個很重要的差異。 為了找出那是什么,先重置一下之前改過的 Session 變量: ~~~js ? Session.set('pageTitle', 'A brand new title'); ? Session.get('pageTitle'); 'A brand new title' ~~~ <%= caption "瀏覽器控制臺(Browser console)" %> 如果我們手動去重載瀏覽器窗口,自然就會丟失我們的 Session 變量(因為這將會創建一個新的會話)。另一方面,如果我們是引發動態代碼重載(即,通過修改并保存我們的源文件)去重新加載頁面,Session 變量卻仍然存在。現在去試一試! ~~~js ? Session.get('pageTitle'); 'A brand new title' ~~~ <%= caption "瀏覽器控制臺(Browser console)" %> 因此,如果使用 Session 變量來保存用戶狀態,用戶幾乎不會察覺到動態代碼重載的發生。因為它將保留所有 Session 變量的值。這可以使我們在部署新版本的時候,用戶發生中斷的機會降到最低。 再想一想,這意味著,只要我們做到用 URL 和 Session 把所有狀態保存下來,那么當更新版本的時候,客戶端**正在運行**的應用程序就可以動態重載,不丟失任何數據。 現在去檢驗一下當我們去手動刷新頁面的時候發生了什么: ~~~js ? Session.get('pageTitle'); null ~~~ <%= caption "瀏覽器控制臺(Browser console)" %> 當我們重載頁面時,我們丟失了 Session 。在 HCR 中,Meteor 將 Session 保存到瀏覽器的本地存儲并且在重載的之后再一次加載它。然而,在重載頁面時發生的丟失行為是有一定道理的:如果用戶重新加載頁面,就好像他們已經再次瀏覽相同的 URL ,而且其他用戶都會看到他們訪問的 URL,所以他們應該重置為初始狀態。 從中我們應該要學會: 1. 應該在 Session 或者 URL 中存儲用戶狀態。從而在動態代碼重載的時候,讓用戶發生中斷的機會降到最低。 2. 盡可能使用 **URL** 去存儲你想要共享在用戶之間的狀態。 以上總結了我們對會話(Session)——— Meteor 最有用的功能之一的探索。不要忘了在進行下一章之前,恢復你對代碼的改動。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看