問題タブ [angularjs-service]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
angularjs - angularjsのCacheFactoryはシングルトンですか?
CacheFactory を使用してサービスを作成しました。私はそれがシングルトンであることを期待していました。コントローラーに挿入すると、コントローラーの範囲内で正常に動作します。しかし、別のスコープを持つ別のページに移動すると、別のスコープの同じコントローラーに保存した値がキャッシュにないように見えます。CacheFactory の動作は、CacheService を注入するすべての場所に同じキャッシュ オブジェクトがあるシングルトンであるべきではありませんか?
これは例としての私のサービスです:
次に、私のコントローラーで:
angularjs - Jasmineを使用した単純なAngularJSサービスのテスト
単体テストをしようとしている簡単なサービスがあります。私が何を試しても、searchServiceが不明なプロバイダーであるか、サービスがnullです(奇妙なことに、テストが失敗することはありません!!)。
誰かが私が間違っているかもしれないことについての洞察を持っていますか?
キャッシュされた値を確認できるように、searchServiceに読み込まれる単体テストを作成しようとしています。
angularjs - バックエンド API のグループ化
AngularJS の $http サービスを使用しているときに、バックエンドへのすべての URL を管理するのが難しいことがわかりました。それらはコントローラーのコードに分散しています。場合によっては、それらが重複していることさえあります。ほとんどの場合、それらはすべて$http.get('/api/something').then(...)
.
それらすべてを異なるサービスに配置するのは非常に不合理に思えます。これはわずか 1 行のコードであり、小さな変更 (ヘッダーの追加など) が必要な場合があります。
他の解決策はそれらを定数に入れることかもしれませんが、この場合、私はまだ$http.get(APIURLs.SomeURL)
少し冗長に見えるものを使用します...
問題は、バックエンドへの URL を管理する最善の方法は何かということです。
angularjs - Angular JS: module.config インジェクションとコントローラー インジェクションの違いはなぜですか?
これは、AngularJS コードを掘り下げてもわかりませんでした。謎の解決に役立つかもしれません。
それを示すために、AngularJS シード プロジェクトにサービスを追加しました。
このプロバイダーが $get と特定の「providerMethod」を公開していることがわかります。
ここで、インジェクションの使用について: config を呼び出すと、クラス全体をインジェクトして、「外部」プロバイダー メソッドにアクセスできます。
しかし、これをコントローラーに注入すると (プロバイダーのない名前に注意してください)、$get の戻り値のみが公開されます。
コンソール出力は次のとおりです: its my service myServiceProvider: Constructor {providerMethod: function, $get: function} its my service.providerMethod MyCtrl1.myservice = Object {name: "stam"} stam
誰でも違いを説明できますか?理由?考えてくれてありがとう
リオール
PS: angular-ui new ui-router (優れたプロジェクト!)でこの手法を見てきました。ジャスミンやその他の場所でインジェクションを行うには、外部プロバイダー クラスにアクセスする必要があります - 役に立たない
angularjs - AngularJS: サービス vs プロバイダー vs ファクトリー
Service
とAngularJSProvider
の違いは何ですか?Factory
angularjs - AngularJS のサービスで .$inject を使用できますか、それともコントローラーにのみ必要ですか?
縮小と難読化の目的で、controllerName.$inject = ['$service', '$service2']
必要な実際のサービス名を指定するには、常に $injector を ( 経由で) 使用する必要があることを認識しています。
ただし、他のサービスに依存するカスタム サービスを作成する場合、同じことを行うことができますか? .$inject メソッドを使用するために私が見つけることができる唯一の例は、コントローラーで呼び出されます。
私がやっているなら
これを追加する必要がありますか?
myService.$inject = ['$rootScope', 'anotherService'];
それとも、モジュール全体に適用されるのでしょうか?
myModule.$inject = ['$rootScope', 'anotherService'];
...しかし、その場合、モジュールはすでにそのサービスを追跡しているので、縮小は問題ではありませんか?
rest - AngularJS コントローラー/サービス/http 通信
コントローラーに挿入される AnguarJS サービスに REST API をラップしました。かなり標準的ですよね。ここで、そのサービスが 401 応答をインターセプトし、何らかの方法でログアウトまたは再ログイン プロンプトなどをトリガーするようにしたいと考えています。問題は、そのサービスがどのスコープにもアクセスできないことです。そのエラーをブロードキャストする最良の方法は何ですか? 私はいくつかのアイデアを思いつきましたが、私はAngularが初めてで、誰かがこれを行う「Angular」の方法を教えてくれるかどうか疑問に思っていますか?
1) サービスを、AppCtrl がリッスンできるイベント プールとして機能させることができます。しかし、これは少し複雑すぎるようです。そう:
2) $rootScope をサービスに挿入し、サービスをisLoggedIn
直接変更できます。しかし、これは明らかに間違っているようです。サービスがデータを処理し、コントローラーがスコープを制御し、ディレクティブが dom をいじる場所を明確に区別したいと思います。
3) 私のすべてのコントローラーは、拒否された promise を監視し、その理由が 401 エラーである場合は、$scope に到達しisLoggedIn
て false に設定することができますが、このオプションは明らかに最悪です。
何か助けはありますか?
ありがとう。
javascript - 値が関数から評価されるときに $watch が機能しないようです
gridBlocks をレンダリングするリピーターがあります。これらの各ブロックには、「良い投票」、「悪い投票」 、または「投票しない」のプロパティがあります (ここでの目的のため)。このプロパティは、とりわけ、ブロックの CSS クラスを制御します。
userService
ユーザー投票のデータ構造は、投票を更新したり、ajax 呼び出しを実行したりするためのメソッドを公開する を介してアクセスされます。
私の問題はこれです:
voteClass
への呼び出しを介して、特定の各ブロックのスコープでプロパティを設定していますuserService
。このプロパティを監視し、モデルが変更されたときにそれに応じて UI を更新したいと思います。
ただし、これは機能していないようです -の値が実際に変更されても、 はvoteClass
再評価されず、呼び出されません。$watch
getVoteClass(scope.block.id)
を使用してみまし$apply
たが、何も変わらないようです。
ご意見をお寄せいただければ幸いです...
Update1getVoteClass(scope.block.id)
:値が変わっても、ブロック スコープ プロパティは変わらないと思います。ブロック スコープにそのプロパティを強制的に再評価させる方法はありますか?
更新 2 - 問題解決:この質問 に関する CaioToOn と Gloopy の助けを借りて、スコープ プロパティがプリミティブ文字列を参照していたという事実に問題があることに気付きました。これを克服するには、関数を監視するか、(プリミティブ文字列ではなく) オブジェクト プロパティへの直接参照を使用します。
コントローラ:
指令:
angularjs - AngularJS : サービス プロパティにバインドする正しい方法
AngularJS でサービス プロパティにバインドする方法のベスト プラクティスを探しています。
AngularJS を使用して作成されたサービスのプロパティにバインドする方法を理解するために、複数の例に取り組みました。
以下に、サービス内のプロパティにバインドする方法の 2 つの例を示します。どちらも機能します。最初の例では基本的なバインディングを使用し、2 番目の例では $scope.$watch を使用してサービス プロパティにバインドしています。
サービスのプロパティにバインドするときにこれらの例のいずれかが優先されますか、それとも私が知らない別のオプションが推奨されますか?
これらの例の前提は、サービスがそのプロパティ「lastUpdated」と「calls」を 5 秒ごとに更新する必要があるということです。サービス プロパティが更新されると、これらの変更がビューに反映されます。これらの例はどちらも正常に機能します。それを行うより良い方法があるかどうか疑問に思います。
基本的なバインディング
次のコードは、ここで表示および実行できます: http://plnkr.co/edit/d3c16z
サービス プロパティへのバインドを解決するもう 1 つの方法は、コントローラーで $scope.$watch を使用することです。
$scope.$watch
次のコードは、ここで表示および実行できます: http://plnkr.co/edit/dSBlc9
サービスで $rootscope.$broadcast を使用し、コントローラーで $root.$on を使用できることは承知していますが、$broadcast/$on を使用して作成した他の例では、最初のブロードキャストがコントローラーですが、ブロードキャストされる追加の呼び出しはコントローラーでトリガーされます。$rootscope.$broadcast の問題を解決する方法を知っている場合は、回答を提供してください。
しかし、前に述べたことをもう一度言いますと、サービス プロパティにバインドする方法のベスト プラクティスを知りたいと思います。
アップデート
この質問は、最初は 2013 年 4 月に尋ねられ、回答されました。2014 年 5 月に、Gil Birman が新しい回答を提供し、それを正解として変更しました。Gil Birmanの回答には賛成票がほとんどないため、この質問を読んでいる人が彼の回答を無視して、より多くの票を持つ他の回答を支持することを懸念しています. 最良の答えを決める前に、Gil Birman の答えを強くお勧めします。