在Angularjs管理僅限客戶狀態
鑰匙要點
-
AngularJ中的
- 查看模型可以具有僅限客戶端狀態,例如“動畫啟動”和“動畫”或“拖動”和“刪除”。使用Angular的$ Resource Service創建和保存視圖模型時,可以管理此狀態。
> >將狀態變化邏輯封裝在一個地方,例如注射服務,可以簡化代碼並減少錯誤,尤其是對於具有多重消費者的應用程序。
- >諸如功能包裝之類的技術可用於保存和檢索數據之前和之後進行不同或其他的事情。這可以增強$ Resource Service的功能。
- >將視圖模型提取到注射服務中可以幫助擴展應用程序,尤其是具有復雜,實時更新的應用程序。觀看和過濾等技術可用於管理狀態變化並改善應用程序API的合成性。
- JavaScript框架(例如AngularJs)中的 >查看模型可能與服務器上的域模型不同 - 視圖模型甚至不必在服務器上存在。因此,視圖模型只能具有客戶端狀態,例如“動畫開始”和“動畫”或“拖動”和“掉落”。這篇文章使用Angular的$ Resource Service創建和保存視圖模型時將集中於狀態更改。
這種方法對於包含單個消費者的應用程序很好。想像一下,對於多個消費者,容易複製此代碼的無聊和錯誤!但是,如果我們可以封裝狀態在一個地方更改邏輯怎麼辦?
>angular<span>.module('clientOnlyState.controllers') </span> <span>.controller('ArticleCtrl', function($scope, $resource, ArticleStates /* simple lookup */) { </span> <span>var Article = $resource('/article/:articleId', { articleId: '@id' }); </span> <span>var article = new Article({ id: 1, title: 'A title', author: 'M Godfrey' }); </span> article<span>.state = ArticleStates.NONE; // "NONE" </span> $scope<span>.article = article; </span> $scope<span>.save = function() { </span> article<span>.state = ArticleStates.SAVING; // "SAVING" </span> article<span>.$save(function success() { </span> article<span>.state = ArticleStates.SAVED; // "SAVED" </span> <span>}); </span> <span>}; </span> <span>});</span>
>讓我們從將我們的文章資源推入註射服務中。當首次創建文章時,我們還將最微不足道的狀態設置添加到無。
檢索和保存怎麼樣?我們希望將文章作為$資源服務出現在消費者身上,因此它必須像一個人一樣始終如一地工作。我在John Resig的出色著作《 JavaScript Ninja的秘密》中學到的一種技術在這裡非常有用 - 功能包裝。這是他的實現直接提升為可注射的角度服務。
>
angular<span>.module('clientOnlyState.services') </span> <span>.factory('Article', function($resource<span>, ArticleStates</span>) { </span> <span>var Article = $resource('/article/:articleId', { articleId: '@id' }); </span> <span>// Consumers will think they're getting an Article instance, and eventually they are... </span> <span>return function(data) { </span> <span>var article = new Article(data); </span> article<span>.state = ArticleStates.NONE; </span> <span>return article; </span> <span>} </span> <span>});</span>
angular<span>.module('clientOnlyState.services') </span> <span>.factory('wrapMethod', function() { </span> <span>return function(object<span>, method, wrapper</span>) { </span> <span>var fn = object[method]; </span> <span>return object[method] = function() { </span> <span>return wrapper.apply(this, [fn.bind(this)].concat( </span> <span>Array.prototype.slice.call(arguments)) </span> <span>); </span> <span>}; </span> <span>} </span> <span>});</span>
>
angular<span>.module('clientOnlyState.controllers') </span> <span>.controller('ArticleCtrl', function($scope, $resource, ArticleStates /* simple lookup */) { </span> <span>var Article = $resource('/article/:articleId', { articleId: '@id' }); </span> <span>var article = new Article({ id: 1, title: 'A title', author: 'M Godfrey' }); </span> article<span>.state = ArticleStates.NONE; // "NONE" </span> $scope<span>.article = article; </span> $scope<span>.save = function() { </span> article<span>.state = ArticleStates.SAVING; // "SAVING" </span> article<span>.$save(function success() { </span> article<span>.state = ArticleStates.SAVED; // "SAVED" </span> <span>}); </span> <span>}; </span> <span>});</span>
封裝益處
>我們已經竭盡全力封裝了控制器之外的狀態變化,但是我們獲得了什麼好處?
>現在,我們的控制器可以利用通過舊狀態通過的手錶聽眾來設置消息。它也可以執行本地翻譯,如下所示。
angular<span>.module('clientOnlyState.services') </span> <span>.factory('Article', function($resource<span>, ArticleStates</span>) { </span> <span>var Article = $resource('/article/:articleId', { articleId: '@id' }); </span> <span>// Consumers will think they're getting an Article instance, and eventually they are... </span> <span>return function(data) { </span> <span>var article = new Article(data); </span> article<span>.state = ArticleStates.NONE; </span> <span>return article; </span> <span>} </span> <span>});</span>
通過濾鏡組合,靈丹妙藥?
>
>類似以下內容是我的想法。表達的每個部分都可以重複使用。
angular<span>.module('clientOnlyState.services') </span> <span>.factory('wrapMethod', function() { </span> <span>return function(object<span>, method, wrapper</span>) { </span> <span>var fn = object[method]; </span> <span>return object[method] = function() { </span> <span>return wrapper.apply(this, [fn.bind(this)].concat( </span> <span>Array.prototype.slice.call(arguments)) </span> <span>); </span> <span>}; </span> <span>} </span> <span>});</span>
因此,我們需要對文章進行稍作修改:
angular<span>.module('clientOnlyState.services') </span> <span>.factory('Article', function($resource<span>, ArticleStates, wrapMethod</span>) { </span> <span>var Article = $resource('/article/:articleId', { articleId: '@id' }); </span> <span>wrapMethod(Article, 'get', function(original<span>, params</span>) { </span> <span>var article = original(params); </span> article<span>.$promise.then(function(article) { </span> article<span>.state = ArticleStates.NONE; </span> <span>}); </span> <span>return article; </span> <span>}); </span> <span>// Consumers will actually call $save with optional params, success and error arguments </span> <span>// $save consolidates arguments and then calls our wrapper, additionally passing the Resource instance </span> <span>wrapMethod(Article, 'save', function(original<span>, params, article, success, error</span>) { </span> article<span>.state = ArticleStates.SAVING; </span> <span>return original.call(this, params, article, function (article) { </span> article<span>.state = ArticleStates.SAVED; </span> success <span>&& success(article); </span> <span>}, function(article) { </span> article<span>.state = ArticleStates.ERROR; </span> error <span>&& error(article); </span> <span>}); </span> <span>}); </span> <span>// $resource(...) returns a function that also has methods </span> <span>// As such we reference Article's own properties via extend </span> <span>// Which in the case of get and save are already wrapped functions </span> <span>return angular.extend(function(data) { </span> <span>var article = new Article(data); </span> article<span>.state = ArticleStates.NONE; </span> <span>return article; </span> <span>}, Article); </span> <span>});</span>
最終結果並不那麼漂亮,但仍然非常強大:
angular<span>.module('clientOnlyState.controllers') </span> <span>.controller('ArticleCtrl', function($scope<span>, Article</span>) { </span> <span>var article = new Article({ id: 1, title: 'A title', author: 'M Godfrey' }); </span> <span>console.log(article.state); // "NONE" </span> $scope<span>.article = article; </span> $scope<span>.save = function() { </span> article<span>.$save({}, function success() { </span> <span>console.log(article.state); // "SAVED" </span> <span>}, function error() { </span> <span>console.log(article.state); // "ERROR" </span> <span>}); </span> <span>}; </span> <span>});</span>
我們的控制器再次變得更傾斜,尤其是如果您認為可以將翻譯拉出到可注射的服務中:
angular<span>.module('clientOnlyState.controllers') </span> <span>.controller('ArticleCtrl', function($scope<span>, Article, ArticleStates</span>) { </span> <span>var article = new Article({ id: 1, title: 'A title', author: 'M Godfrey' }); </span> <span>var translations = {}; </span> translations<span>[ArticleStates.SAVED] = 'Saved, oh yeah!'; </span> translations<span>['default'] = ''; </span> $scope<span>.article = article; </span> $scope<span>.save = function() { </span> article<span>.$save({}); </span> <span>}; </span> $scope<span>.$watch('article.state', function(newState<span>, oldState</span>) { </span> <span>if (newState == ArticleStates.SAVED && oldState == ArticleStates.SAVING) { </span> $scope<span>.message = translations[newState]; </span> <span>} else { </span> $scope<span>.message = translations['default']; </span> <span>} </span> <span>}); </span> <span>});</span>
結論
<span><span><span><p</span>></span>{{article.state | limitToTransition:"SAVING":"SAVED" | translate}}<span><span></p</span>></span></span>
>我提出了一種基於舊值和新值觀察的替代方法。兩者都是完全可以接受的技術 - 實際上,當我開始研究這篇文章時,我想到的是我的想法。過濾是在完成後附近發現的潛在改進。
>我很想看看我提出的技術是否可以幫助您擴展Angular應用程序。所有反饋都將在評論中得到極大的收穫!
>在研究此帖子時創建的代碼樣本也可以在GitHub上找到。
>在Angularjs中管理客戶狀態的經常詢問的問題
> $ state -provider在AngularJS中管理客戶端狀態的作用是什麼?這是一項允許您為應用程序定義狀態的服務。每個狀態就整體UI和導航而言,對應於應用程序中的“位置”。 $ state -provider提供了路由不同視圖的API。激活狀態時,它可以通過Resolve屬性解析一組數據。然後將這些數據注入控制器。 >>我如何在$ state -provider中使用resolve屬性?用於在激活狀態之前解決一組數據。然後將這些數據注入控制器。解析屬性是包含鍵值對的對象。關鍵是要注入控制器的依賴項的名稱,該值是返回依賴關係值的函數。
>在Angularjs中使用UI-Router進行狀態管理有什麼好處?它允許嵌套視圖和多個命名視圖,這在較大的應用程序中可能非常有用。它還提供了基於狀態的路由,它比AngularJS中的基於默認路由的路由更靈活,更強大。
>我如何在gangularjs中的狀態之間過渡?在AngularJS中使用$ state.go()方法。該方法將狀態的名稱作為其第一個參數,而參數的可選對像是其第二個參數。參數對象可用於將數據傳遞到要過渡到的狀態。
我可以在沒有狀態管理工具的情況下使用AngularJS嗎?但是,隨著您的應用程序的複雜性增長,如果使用UI-Router這樣的工具,管理狀態可能會變得越來越困難。使用狀態管理工具可以幫助維持應用程序用戶界面的一致性和可預測性。
>>在AngularJS中管理狀態的一些共同挑戰是什麼?保持用戶界面的一致性,跟踪應用程序狀態的變化以及管理應用程序的行為。通過使用UI-Router等狀態管理工具。
>我如何在$ state -provider中使用resolve屬性?用於在激活狀態之前解決一組數據。然後將這些數據注入控制器。解析屬性是包含鍵值對的對象。關鍵是要注入控制器的依賴項的名稱,該值是返回依賴關係值的函數。
>在Angularjs中使用UI-Router進行狀態管理有什麼好處?它允許嵌套視圖和多個命名視圖,這在較大的應用程序中可能非常有用。它還提供了基於狀態的路由,它比AngularJS中的基於默認路由的路由更靈活,更強大。
>我如何在gangularjs中的狀態之間過渡?在AngularJS中使用$ state.go()方法。該方法將狀態的名稱作為其第一個參數,而參數的可選對像是其第二個參數。參數對象可用於將數據傳遞到要過渡到的狀態。
我可以在沒有狀態管理工具的情況下使用AngularJS嗎?但是,隨著您的應用程序的複雜性增長,如果使用UI-Router這樣的工具,管理狀態可能會變得越來越困難。使用狀態管理工具可以幫助維持應用程序用戶界面的一致性和可預測性。
>>在AngularJS中管理狀態的一些共同挑戰是什麼?保持用戶界面的一致性,跟踪應用程序狀態的變化以及管理應用程序的行為。通過使用UI-Router等狀態管理工具。
以上是在Angularjs管理僅限客戶狀態的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

不同JavaScript引擎在解析和執行JavaScript代碼時,效果會有所不同,因為每個引擎的實現原理和優化策略各有差異。 1.詞法分析:將源碼轉換為詞法單元。 2.語法分析:生成抽象語法樹。 3.優化和編譯:通過JIT編譯器生成機器碼。 4.執行:運行機器碼。 V8引擎通過即時編譯和隱藏類優化,SpiderMonkey使用類型推斷系統,導致在相同代碼上的性能表現不同。

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

從C/C 轉向JavaScript需要適應動態類型、垃圾回收和異步編程等特點。 1)C/C 是靜態類型語言,需手動管理內存,而JavaScript是動態類型,垃圾回收自動處理。 2)C/C 需編譯成機器碼,JavaScript則為解釋型語言。 3)JavaScript引入閉包、原型鍊和Promise等概念,增強了靈活性和異步編程能力。

JavaScript在Web開發中的主要用途包括客戶端交互、表單驗證和異步通信。 1)通過DOM操作實現動態內容更新和用戶交互;2)在用戶提交數據前進行客戶端驗證,提高用戶體驗;3)通過AJAX技術實現與服務器的無刷新通信。

JavaScript在現實世界中的應用包括前端和後端開發。 1)通過構建TODO列表應用展示前端應用,涉及DOM操作和事件處理。 2)通過Node.js和Express構建RESTfulAPI展示後端應用。

理解JavaScript引擎內部工作原理對開發者重要,因為它能幫助編寫更高效的代碼並理解性能瓶頸和優化策略。 1)引擎的工作流程包括解析、編譯和執行三個階段;2)執行過程中,引擎會進行動態優化,如內聯緩存和隱藏類;3)最佳實踐包括避免全局變量、優化循環、使用const和let,以及避免過度使用閉包。

Python和JavaScript在社區、庫和資源方面的對比各有優劣。 1)Python社區友好,適合初學者,但前端開發資源不如JavaScript豐富。 2)Python在數據科學和機器學習庫方面強大,JavaScript則在前端開發庫和框架上更勝一籌。 3)兩者的學習資源都豐富,但Python適合從官方文檔開始,JavaScript則以MDNWebDocs為佳。選擇應基於項目需求和個人興趣。

Python和JavaScript在開發環境上的選擇都很重要。 1)Python的開發環境包括PyCharm、JupyterNotebook和Anaconda,適合數據科學和快速原型開發。 2)JavaScript的開發環境包括Node.js、VSCode和Webpack,適用於前端和後端開發。根據項目需求選擇合適的工具可以提高開發效率和項目成功率。
