Так же, как упомянуто @NullVoxPopuli, это зависит от вашей версии ember, но я собираюсь предположить, что вы используете > 3
или более позднюю версию.
Мое первое замечание заключается в том, что я почти исключительно перешел к импорту и использованию функции get
, которая, как и , определена в документации и очень хорошо описана. @Pavol в другом подобном посте , позволяет вам не знать, пытаетесь ли вы получить свойство для простого объекта javascript или объекта Ember.Object
.
Чтобы ответить более прямо, я не уверен, что служба, на которую вы ссылаетесь, пытается выполнить, но основываясь на том, что вы написали, вы вполне могли бы просто позвонить get(this, 'maps.location')
в вашем контроллере. и удалите или игнорируйте этот метод обслуживания.
В документации Ember также указывается, что, пока вы знаете метод, который вы хотите использовать из внедренного сервиса, вы можете просто вызывать его из текущего объекта Ember.Object без использования get
; например:
export default Controller.extend({
maps: service(),
location: computed('maps.location', function() {
return this.maps.getLocation()
})...
Причина, по которой вы можете захотеть использовать get
, заключается в том, что вы не уверены, что свойство, к которому вы обращаетесь, вычислено или нет.
Когда вы вызываете
BLOCKQUOTE>get
для вычисляемого свойства, вызывается функция, и вместо самой функции возвращается возвращаемое значение.
Я думаю, вы делаете это более сложным, чем нужно. Вам просто нужно запомнить две вещи:
Это означает, что если вы напишите:
publisher.SomeEvent += subscriber.SomeMethod;
, то подписчик
не будет иметь право на сборку мусора до Издатель
, если вы не отмените подписку позже.
Обратите внимание, что во многих случаях подписчик
является просто , этот
:
publisher.SomeEvent += myDataTimer_Elapsed;
эквивалентен:
publisher.SomeEvent += this.myDataTimer_Elapsed;
при условии, что это экземпляр метод.
Соответствующий случай, когда вы должны отказаться от подписки на событие, выглядит следующим образом:
public class A
{
// ...
public event EventHandler SomethingHappened;
}
public class B
{
private void DoSomething() { /* ... */ } // instance method
private void Attach(A obj)
{
obj.SomethingHappened += DoSomething();
}
}
В этом сценарии, когда вы избавляетесь от B, все равно будет свисающая ссылка на него из Обработчик событий obj
. Если вы хотите освободить память B, вам нужно сначала отсоединить B.DoSomething ()
от соответствующего обработчика событий.
Вы можете столкнуться с тем же самым, если строка подписки на событие выглядит так , конечно:
obj.SomethingHappened += someOtherObject.Whatever.DoSomething();
Теперь это someOtherObject
, который находится на крючке и не может быть собран мусором.
Оставшиеся ссылки, предотвращающие сборку мусора, имеют еще один эффект, который может быть очевиден, но тем не менее еще не заявлен в этом потоке; присоединенный обработчик событий также будет оправдан.
Я испытал это пару раз. Одним из них было, когда у нас было приложение, которое постепенно становилось медленнее и медленнее, чем дольше оно выполнялось. Приложение создавало пользовательский интерфейс динамически, загружая пользовательские элементы управления. Контейнер заставлял пользовательские элементы управления подписываться на определенные события в среде, и одно из них не отменялось после того, как элементы управления были «выгружены».
Через некоторое время это приводило к выполнению большого числа прослушивателей событий каждый раз, когда конкретное событие было поднято. Это, конечно, может привести к серьезным гоночным условиям, когда большое количество «спящих» экземпляры внезапно просыпаются и пытаются действовать на одном и том же входе.
Короче говоря; если вы пишете код для подключения прослушивателя событий; убедитесь, что вы выпустили, как только он больше не нужен. Я почти осмелюсь обещать, что это избавит вас от хотя бы одной головной боли в будущем.