Ответ 1
Хорошо, я не могу видеть все, что вы делаете, но вы, вероятно, около 1/2 пути.
Вот рабочий план того, что я собираюсь описать
injector.get()
должен возвращать тот же экземпляр службы, что и в вашем приложении. Вероятно, вы просто видите проблему, которая заставляет вас думать, что у вас другой экземпляр.
Итак, что вам нужно сделать:
- Убедитесь, что то, что вы добавляете в свою область действия из своей службы, - это ссылка объект. Если это примитивный тип, он не будет той же ссылкой, поэтому он не будет обновляться.
- Обязательно откройте область angular с помощью
angular.element(DOMElement).scope()
, а затем вызовите$apply()
на ней.
Здесь код:
app.controller('MainCtrl', function($scope, myService) {
// Set a var on the scope to an object reference of the
// (or from the) service.
$scope.myService = myService;
});
app.factory('myService', function(){
return {
foo: 'bar'
};
});
//do a little something to change the service externally.
setTimeout(function(){
//get your angular element
var elem = angular.element(document.querySelector('[ng-controller]'));
//get the injector.
var injector = elem.injector();
//get the service.
var myService = injector.get('myService');
//update the service.
myService.foo = 'test';
//apply the changes to the scope.
elem.scope().$apply();
}, 2000)
Другие мысли:
- Возможно, вы захотите ввести
$window
в свою службу, а не использовать объект окна, чтобы поддерживать тестируемость вашей службы. - Директива, вероятно, является лучшим выбором для манипуляций с DOM, таких как создание проигрывателя Flash-роликов.