0

私は角度が初めてで、最初の「実際の」アプリケーションを開発しています。私はカレンダー/スケジュールアプリを構築しようとしています (ソースコードはすべてgithubで見ることができます)、ユーザーがログインしている場合にコンテンツを変更できるようにしたい (つまり、それらに関連する詳細を表示する) が、ここにキャッチがあります:

  1. ログインしているユーザーにアプリを依存させたくありません (パブリック、プライベート、またはその両方で動作するように構成できるものが必要です)

  2. 回避できる場合は、このアプリ内にユーザー/ログインを実装したくありません (最終的には、これが実装される可能性のある別のアプリに自分のアプリを含めたいと考えていますが、必ずしも特定のセキュリティ フレームワークを使用して実装されているとは限りません。 )

アプリケーション全体で参照できるグローバル変数を作成するかuser、このアプリですべてを実行するシステムを実装する必要がある場合は、抽象的な方法でそれを実行して、さまざまなオプションを挿入できるようにすることを考えていました。の。

私が何をすべきかについての私の考えや理解のいくつかは完全に間違っていて、基本的なことを知らないかもしれませんが、これを行うためにどのようなアプローチをとるべきか本当にわかりません.

関連する場合、現在バックエンドはありませんが、最終的にはストレージにMongoDBを使用し、サービスにnodejsを使用することを望んでいますが、他の人がsqlなどの異なるストレージ/バックエンドを使用できるように、オープンエンドのままにしておきたいですphp

user別の(親?)アプリから注入/入力できるグローバル変数/サービスを用意する必要はありますか?

もしそうなら、そうするための最良のアプローチは何ですか?そうでない場合、なぜ、どのようなアプローチをとるべきか、またその理由は?

アップデート

私はオンラインのコメントと、サービスが最良の選択肢であるといういくつかの提案から信じていますが親アプリケーションからこのアプリケーションサービスにどのように注入しますか?

4

4 に答える 4

3

(単一の)ページがサーバーによって動的にレンダリングされ、サーバーがログインしているかどうかを認識している場合、次のことができます。

以下を生成するスクリプト タグを動的にレンダリングします。

<script>
     window.user = { id: 1234, name: 'User A', isLoggedIn: true };
</script>

ログインしていないユーザーの場合:

<script>
     window.user = { isLoggedIn: false };
</script>

便宜上、ユーザーを angular の IOC 内の値にコピーします。

angular.module('myApp').value('user', window.user);

次に、DIで使用できます。

angular.module('myApp').factory('myService', function(user) {
    return {
        doSomething: function() {
            if (user.isLoggedIn) {
                ...
            } else {
                ...
            }
        }
    };
});

トリッキーなこと ([SEE COMMENTS] を実行する前に 2 回行う必要があります) は、$scopeを拡張しています。

angular.module('myApp').config(function($provide) {
    $provide.decorator('$controller', function($delegate, user) {
        return function(constructor, locals) {
            locals.$scope._user = user;
            return $delegate(constructor, locals);
        };
    });
});

このコードは$controllerサービスを装飾し (コントローラーの構築を担当)、基本的に、$scopeオブジェクトがコントローラーに渡される前に_userプロパティで拡張されることを示しています。

自動的に $scoped を持つということは、どこでも任意のビューで直接使用できることを意味します。

<div ng-if="_user.isLoggedIn">Content only for logged-in users</div>

元の $scope API またはコントローラーに追加するプロパティとの名前の競合が発生する可能性があるため、これは危険です。

言うまでもなく、これらはクライアントでのみ実行され、簡単に改ざんできます。サーバー側のコードは常にユーザーをチェックし、正しいデータ サブセットを返すか、正しいアクションを受け入れる必要があります。

于 2013-11-05T17:45:42.263 に答える
2

はい、$rootScope で実行できます。ただし、サービス内に配置することをお勧めします。サービスはシングルトンであり、アプリケーション全体で同じ状態を維持するため、ユーザー オブジェクトなどの保存に適しています。私の意見では、$rootScope の代わりに「ユーザー」サービスを使用することは、より良い組織です。技術的には同じ結果を得ることができますが、一般的に言えば、 $rootScope に機能を過剰に入力することは望ましくありません。

于 2013-11-05T17:11:19.990 に答える
1

の場合と同様に、グローバル オブジェクトをコントローラの引数に入れるだけで、グローバルuserオブジェクトをすべてのコントローラに挿入できます。次に、簡単なチェックで機能を実装できます。これにより、Angular のドメインと DI の優れたプラクティス内で、グローバル変数として機能し、好きな方法と好きな場所でオブジェクトをモデル化できます。$rootScope$scopeif($rootScope.user)user

于 2013-11-05T16:56:24.317 に答える