2013-04-23 2 views
2

У меня есть следующий сценарий: - приложение с большим количеством предметов. (1mil +) - по каждому пункту в списке можно наблюдать один.Уничтожить наблюдаемые при отписке

Если я создаю наблюдаемые из инициализации приложения, приложение замерзнет, ​​так как требует много обработки и памяти. Решение состоит в том, чтобы создавать их по требованию, поскольку элементы будут отображаться по частям за раз. Это довольно легко сделать.

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

Одним из решений является то, что когда я переключаюсь на новую партию, повторяю старую партию и уничтожаю. Это также довольно легко сделать, но, к сожалению, недостаточно.

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

Так что мой вопрос. Есть ли какой-либо способ (встроенный или нет) в нокаут, чтобы уничтожить наблюдаемый, как только на нем больше нет подписчиков?

спасибо.

+0

'ko.computed' должен быть вручную удален, потому что он создает новые ссылки на другие наблюдаемые данные, но обычный наблюдаемый должен быть сборкой мусора JS, если больше ссылок на него нет. Неужели я ошибаюсь? –

+0

не очень. ko.computed имеют следующие 2 варианта: disposeWhen и disposeWhenNodeIsRemoved, чтобы избавиться от них. Наблюдения в основном привязаны к модели, поэтому, если вы специально не удаляете их, они не будут собраны. Моя проблема заключается в том, что мне нужно знать, когда нужно распоряжаться наблюдаемыми, что-то вроде disposeWhenNodeIsRemoved будет абсолютно фантастическим, но я не нашел что-то подобное или обратный вызов. –

+0

Является ли ваша «логика создания по требованию» в одном месте или в каждом компоненте? Если вы можете поместить эту логику в одном месте, не могли бы вы также отследить их и отвязать предыдущие? –

ответ

0

не будет Delete operator работать в этом случае? если удаление определенных свойств объекта - это то, что вы хотите выполнить, то использование оператора delete должно сделать трюк.

var viewModel = { name: ko.observable("me"),` age: "a lot" }; 

и когда вы будете готовы удалить свойство (через событие или иным образом)

$('element').on('event', function() { delete viewModel.prop; }); 

это если вы хотите предназначаться только одно свойство в объекте Нокаут вид модели.

+0

delete работает как «метод удаления». Проблема заключается в отслеживании того, что мне нужно удалить. Первоначальная проблема заключалась в том, что нокаут дает мне возможность отслеживать и не писать код сам. –

+0

@DumitrescuBogdan Я думаю, что это то, что вы ищете. [Ссылка] (http://www.knockmeout.net/2012/05/using-ko-native-pubsub.html) –

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