0

プロジェクトで角度とグラファナを使用しています。私はservice->を持っていますdashboardViewStateSrv

私のサービスコード:

define([
  'angular',
  'lodash',
  'jquery',
],
function (angular, _, $) {
  'use strict';

  var module = angular.module('grafana.services');

  module.factory('dashboardViewStateSrv', function($location, $timeout) {

    function DashboardViewState($scope) {
      var self = this;
      self.state = {};
      self.panelScopes = [];
      self.$scope = $scope;
     // something
    }

    return {
      create: function($scope) {
        return new DashboardViewState($scope);
      }
    };

  });
});

私のサイドメニューコントローラーで:

 $scope.dashboardViewState = dashboardViewStateSrv.create($scope);

    if ($scope.dashboardViewState) {
       if($scope.dashboardViewState.state.citreedepth){
          depth = +$scope.dashboardViewState.state.citreedepth;
       }
    }

マイ ダッシュボード コントローラーで:

$scope.dashboardViewState = dashboardViewStateSrv.create($scope);

DashboardViewStateオブジェクトが 2 回作成されています (ダッシュボード Ctrl とサイド メニュー Ctrl)。オブジェクトを2回作成してDashboardViewStateいますが、それを避けたいです。DashboardViewStateサイド メニュー ctrl でオブジェクトを作成しないようにするにはどうすればよいですか?

ビュー ステートは 1 つだけである必要があります。私の理解によると、すべてのサービスはAngularのシングルトンです。

私に何ができるか教えてください。

4

1 に答える 1

1

thisサービスはシングルトンです。本質的には、サービス内でキーワードを使用できるようにする構成関数です。それらは最初に作成されたときに一度インスタンス化され、そのインスタンスはアプリ全体で共有されます。

工場は工場です。Angular のどこかでObject.create()、ファクトリから返されたオブジェクトを呼び出します。つまり、各呼び出しはその新しいインスタンスを返します。

したがって、ユースケースでは、新しいオブジェクトを2回作成します。最初にファクトリを使用し、次にそのファクトリから新しいオブジェクトを返します。

これは役立つかもしれませんhttp://blog.thoughtram.io/angular/2015/07/07/service-vs-factory-once-and-for-all.html

したがって、アプリケーションを通じてオブジェクトの単一インスタンスが必要な場合は、.service()notを使用する必要があり.factory()ます。

一度だけ新しいオブジェクトをインスタンス化したい場合は、サービスを使用できます。オブジェクトをプロパティとして取得し、メソッドを取得します。サービスは、オブジェクトが既に作成されているかどうかを確認し、作成されていない場合は作成します。

このようなもの(コード例、テストされていません):

  module.service('dashboardViewStateSrv', function($location, $timeout) {

    this.object;

    this.get = function (){
        if(this.object === undefined) {
            return this.object = Object.create({}); //Create your object
        } else {
            return this.object;
        }
    }
});

しかし、私はいくつかのブーブーに気付きました (申し訳ありませんが、私がそう言うといつもフックを思い出させます)。まず、キーワードのエイリアスを作成する必要はありませんthis。jQuery コールバックで機能していませんでした。関数をバインドできたとしてもです。

第二に、これは重要です。オブジェクトをサービスに渡し$scopeますが、これは非常に悪いことです。この理由だけでなく、コントローラーが への参照を持っている場合、どのようにコントローラーが単一のサービス オブジェクトを共有できます$scopeか? サービスは、入力データと出力データを持つ単一の単純なメソッドのコレクションである必要があります。彼らはそれに取り組み、続けています。次に、それらをチェーンして、各メソッドが必要とする特定のデータを渡すことができます。それらは、非表示のプロパティにすべてが含まれているモノリシック オブジェクトであってはなりません。

于 2015-10-20T06:49:27.477 に答える