2015-01-21 5 views
0

Я работаю над angularjs $ modal. я храню значения в контроллере, как показано ниже,Уничтожить объект полностью

if($scope.mediacontent){ 
delete $scope.mediacontent;} 
$scope.mediacontent[$scope.slider_url] =media_data; 
$scope.mediacontent[$scope.slider_url][img_no].active=true; 

Теперь, когда открывается следующий раз $ модальный Я хочу, чтобы уничтожить объект медиа-контента, но с delete объект не уничтожается полностью.

Как уничтожить удалить $scope.mediacontent Объект полностью.

+0

Я бы сказал, что вы также представили модель в виде мнений, поэтому ее уничтожение в определенном объеме невозможно. Вы можете переписать его другим объектом. Или вы можете удалить DOM-узлы и переписать объект. – Blauharley

+2

Код, который вы указали, вызывает ошибки, которые вы должны видеть в консоли. Первая строка, 'delete $ scope.mediacontent = {};' производит: "SyntaxError: Левая сторона оператора '=' должна быть ссылкой." Вы не можете удалить и назначить в том же заявлении. – JAAulde

+0

@JAAulde oh моя ошибка, я пытался удалить $ scope.mediacontent, я вставляю его здесь неправильно. – anam

ответ

3

(я предполагаю syntax и other errors, что JAAulde указывал на самом деле не в вашем коде, или что вы исправили его.)

but with delete Object is not destroyed Completely...

delete не освобождает объекты; он удаляет свойства. Объект будет иметь право на сбор мусора, если свойство, которое вы удаляете, является единственной ссылкой на объект. Когда и как происходит фактическая сборка мусора, зависит от механизма JavaScript (это вряд ли произойдет сразу). Если у вас есть другие ссылки на этот объект, то удаление этого свойства не сделает его подходящим для GC (из-за других ссылок на него).

Но если вы собираетесь присвоить новое значение этому свойству, нет причин для delete; присвоение нового значения также освобождает ссылку на предыдущий объект, что делает его приемлемым для GC (при условии, что ничто другое не ссылается на него).

Например, этот код будет полностью освободить старый объект (если что-то еще не имеет ссылку на него):

$scope.mediacontent = {}; 
$scope.mediacontent[$scope.slider_url] = media_data; 
$scope.mediacontent[$scope.slider_url][img_no].active = true; 

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

+0

hey thanx, но как удалить другой объект целиком. потому что у меня есть $ scope.mediacontent [$ scope.slider_url] [img_no]. active, при следующем вызове i dnt имеет предыдущий img_no. поэтому я не могу сделать это ложным. Я работаю с карусели, и в то время, когда одно значение массива может быть активным, установлено значение true. – anam

+0

@anam: Снова: удаление последней ссылки на объект ** делает ** «удалять» его (сделать его пригодным для сбора мусора). Не имеет значения, имеет ли объект свойства, относящиеся к другим объектам; они также будут иметь право на GC, если ссылка на них - это * только * ссылка на них (а не если это не так). –

+0

@anam: Итак, если у нас есть объект, мы ссылаемся на 'obj.a', а' obj.a.foo' ссылается на другой объект, тогда 'delete obj.a;' освобождает ссылку на первый объект. Если это единственная ссылка, она становится доступной для GC. Если свойство 'foo' этого объекта является единственной ссылкой на второй объект, то второй объект также становится доступным для GC. –

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