2015-10-20 4 views
0

Я использую угловые и grafana в моем проекте. У меня есть service ->dashboardViewStateSrvобъект создается дважды угловой

Моя_служба Код: объект

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

DashboardViewState:

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; 
     } 
    } 

В Мой контроллер Dashboard является творчеством дважды (Ctrl + Ctrl + Ctrl). Я создаю DashboardViewState объект дважды, я хочу этого избежать. Если я могу избежать создания объекта DashboardViewState в Side Menu ctrl?

Должно быть только одно состояние просмотра. По моему пониманию, все услуги являются одноточечными в угловых условиях.

Пожалуйста, руководствоваться мной, что я могу сделать?

+2

Услуги Singleton, но поскольку вы принудительно создаете новый объект, создавая новый DashboardViewState ($ scope), создается новый экземпляр DashboardViewState и присваивается ему новый контекст. –

+0

Если я не ошибаюсь, вы хотите позвонить на завод один раз и использовать его через различные контроллеры? –

+0

Ананд Да, правильно .. Значит, я могу включить один раз и использовать его всегда. –

ответ

1

Услуги являются одноточечными, они по существу являются конструктивной функцией, позволяющей использовать в них ключевое слово this. Они создаются один раз при первом создании, тогда этот экземпляр используется во всем приложении.

Заводы, ну, заводы. Где-то в Угловом он назовет Object.create() на объекте вашего возвращения с завода. Значение каждого вызова возвращает новый экземпляр.

Так что в вашем случае использования вы создаете новый объект дважды. Сначала используйте фабрику, затем вторую, вернув новый объект с этой фабрики.

Это может помочь http://blog.thoughtram.io/angular/2015/07/07/service-vs-factory-once-and-for-all.html

Так что, если вы хотите один экземпляр объекта с помощью приложения вы должны использовать .service() не .factory();

Если вы хотите создать экземпляр нового объекта только после того, как сможете воспользоваться услугой. Иметь объект как свойство и метод get. Служба может проверить, был ли объект уже создан и если он не был выполнен.

что-то вроде этого (например, кода, не тестируется):

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; 
     } 
    } 
}); 

однако я заметил некоторые гадости (К сожалению всегда напоминает мне о Hook, когда я говорю, что). Во-первых, вам не нужно использовать псевдоним this, не работая в обратном вызове jQuery, даже если бы мы были связаны с вашей функцией и т. Д.

Во-вторых, и это важно. Ваша передача объекта $scope в ваш сервис, это очень плохо. Не только по этой причине, но как контроллеры могут совместно использовать один служебный объект, если у него есть ссылка на $scope? Ваши сервисы должны быть набором простых простых методов, которые имеют свои входные и выходные данные. Они работают над этим и продолжают. Затем вы можете связать их и передать им конкретные данные, которые нужны каждому методу. Они не должны быть монолитным объектом, который имеет все в скрытых свойствах, думаю, функциональный, конвейер, если хотите.

+0

Я использую grafana в своем проекте, и грамма имеет в себе эту концепцию. Любое другое решение вместо использования в кружевах фабрики. –

+0

Я должен использовать завод или услугу ?? –

+1

Вы можете использовать любой из них. http://jsfiddle.net/dL6v98zo/ Однако вам необходимо сохранить ссылку на созданный объект, чтобы вы знали, что вы уже создали его. Служба может быть немного более эффективной, поскольку ее не запускают через Object.create каждый раз, когда вы ее вводите. Однако оба чувствуют себя «неправильно». Посмотрите на прототип каждого зарегистрированного объекта. Первый контроллер устанавливает свои данные. Несмотря на то, что второй контроллер передает данные, которые они должны установить, они оба получают уже созданный объект. – ste2425