2016-09-19 3 views
1

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

angular.module('testModule', []) 
 
    .controller('testController', function(testService, $scope) { 
 
    var vm = this; 
 

 
    vm.init = function() { 
 
     vm.hash = vm.hash(); 
 
     testService.setHash(vm.hash); 
 
    } 
 

 
    vm.getServiceHash = function() { 
 
     vm.serviceHash = testService.hash; 
 
    } 
 

 
    vm.init(); 
 
    }) 
 
    .service('testService', function() { 
 
    var testService = { 
 
     hash: null 
 
    }; 
 

 
    testService.setHash = function(hash) { 
 
     testService.hash = hash; 
 
    } 
 

 
    return testService; 
 
    }) 
 
    .directive('test', function() { 
 
    return { 
 
     restrict: 'E', 
 
     template: $("#test\\.html").html(), 
 
     controller: 'testController', 
 
     controllerAs: 'test', 
 
     bindToController: { 
 
     hash: '&', 
 
     }, 
 
     scope: {} 
 
    } 
 
    }); 
 

 
var app = angular.module('myApp', ['testModule']); 
 
app.controller('myController', function($scope) {})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script> 
 
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.0/angular.min.js"></script> 
 

 
<body> 
 
    <div ng-app="myApp" ng-controller="myController"> 
 
    <test hash="'123'"></test> 
 
    <test hash="'321'"></test> 
 
    </div> 
 

 
    <script type="text/ng-template" id="test.html"> 
 
    <p> 
 
     <h2> Controller hash: {{test.hash}} </h2> 
 
     <button type="button" ng-click="test.getServiceHash()">Get service hash</button> 
 
     <h2> Service hash: {{test.serviceHash }} </h2> 
 
    </p> 
 
    </script> 
 

 
</body>

+0

Услуги создаются только один раз в Угловом. Если вам нужна ваша услуга, чтобы обслуживать более одного клиента (т. Е. Два ваших компонента чата), вам нужно будет адаптировать ваш сервис для этого. – jjmontes

+0

Есть ли у вас какие-либо предложения @jjmontes? –

+1

Это хороший вариант для ориентации объектов в угловом. Каждый из ваших вызовов хэша на ваш «сервис» может вернуть новый объект JS, который будет выделен для этого конкретного клиента. В AJS «услуга» - это просто «синтаксический сахар» на вершине «фабрики», и службы всегда являются синглонами, как упоминалось. Вот пример того, как вы можете создать фабрику объектов в AJS: http://blog.revolunet.com/blog/2014/02/14/angularjs-services-inheritance/ – MoMo

ответ

1

Как отмечалось @jjmontes в комментарии, услуги одиночек в Угловое. Таким образом, они не должны поддерживать какое-либо государство, если это государство не применяется ко всем потребителям. Например, общий набор данных, который применяется ко всем потребителям, может быть восстановлен один раз, а затем использован всеми, а не повторить потенциально дорогостоящий вызов. Однако любые данные, относящиеся к контроллеру, должны храниться в контроллере и передаваться службе по требованию.

В частности, в вашем случае вместо того, чтобы устанавливать значение хэша в службе, вы должны передать его в качестве параметра методу службы, который вызывает экземпляры контроллера.

.service('testService', function() { 
    var testService = { 
    }; 

    testService.callService = function(hash) { 
    // call an API or whatever, passing the hash 
    } 

    return testService; 
}) 
+0

Неправильно ли мне использовать класса и создать новый экземпляр для каждого контроллера? –

+1

@GuilhermeReda Я не думаю, что это было бы «неправильно» обязательно. Зависит от того, как вы хотите его использовать. Похоже, вы в основном хотите модель представления. Это реальность при многих применениях. – GalacticCowboy

Смежные вопросы