記事リソースを注射可能なサービスに引き出すことから始めましょう。また、記事が最初に作成されたときに、最も些細な状態の設定を誰にも追加しません。
検索と保存はどうですか?消費者に$リソースサービスとして現れることを望んでいるので、一貫して1つのように機能する必要があります。 John Resigの優れた本「Secrets of the JavaScript Ninja」で学んだテクニックは、ここで非常に便利です - 機能ラッピング。彼の実装は、注射可能な角度サービスに直接持ち上げられました。
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.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>
私たちはコントローラーの外側の状態の変更をカプセル化するために妥当な長さになりましたが、私たちはどのような利点を得ていますか?
私たちのコントローラーは、古い状態と新しい状態を通過している時計リスナーを利用してメッセージを設定できるようになりました。以下に示すように、ローカル翻訳を実行することもできます。$は、アプリケーションのAPIを形成するスコープ、ディレクティブ、フィルターを考慮してください。 HTMLビューこのAPIを消費します。 APIの複合性が大きいほど、再利用の可能性が高くなります。フィルターは、新しいウォッチングと古い監視にわたって複合性を改善できますか?
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 1.3の時点で、フィルターは$ Statefulプロパティを使用できますが、Angularが入力パラメーターの値に基づいてフィルターを呼び出す結果をキャッシュできないため、その使用は強く落胆しています。そのため、ステートフルなパラメーターで制限範囲(前の状態)に渡され、翻訳(利用可能な翻訳)。
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>
私たちのコントローラーは、特に翻訳を注射可能なサービスに引き出すことができると考える場合に再びleanせます。
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>
UI-Routerは、AngularJSの州管理にいくつかの利点を提供します。ネストされたビューと複数の名前付きビューを可能にします。これは、より大きなアプリケーションで非常に役立ちます。また、AngularJSのデフォルトのルートベースのルーティングよりも柔軟で強力な状態ベースのルーティングも提供します。 $ state.go()メソッドを使用してangularjsで。この方法は、状態の名前を最初の引数として、およびその2番目の引数としてパラメーターのオプションのオブジェクトを受け取ります。パラメーターオブジェクトを使用して、データを状態に渡す状態にデータを渡すことができます。
以上がAngularJSのクライアントのみの状態を管理しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。