在角度應用程序中,我想將元素從DOM樹的一部分移到另一部分,而無需重新加載連接到移動元素的控制器。在DOM中移動控制器時保留元素/作用域狀態
我已經創建了一個簡化的plunker來說明:http://plnkr.co/edit/sqBRM3ZQ5G9xpiNd1MXm?p=preview
在這種plunker,要保留的唯一數據是toggler狀態,但實際上,它可能是一個非常大的數據量,這可能需要一很多努力來初始化。
我想要做的是能夠將模板1從指令1移動到指令2,但我想保留觸發器的狀態。在這種情況下,如果您單擊切換器使其變爲綠色,然後單擊「從列表1移動到2」兩次,它將將其移動到指令2,但將顏色重置爲紅色。
爲了避免這種情況,我可以在不通知角度的情況下移動元素,但這顯然會導致應用程序狀態中斷。
我以爲只是將控制器從舊範圍移動到新範圍,但我覺得這會導致關閉問題,因爲舊控制器可能引用了不再在DOM中的舊元素等。
有沒有一種很好的方法來解決這個問題?
添加一些代碼,因爲StackOverflow上需要它,而是指改爲plunker:有觀點
angular.module('app').controller('bodyController', ['$element', function ($element) {
this.contents1 = [{
path: 'template1.html'
}, {
path: 'template2.html'
}];
this.contents2 = [{
path: 'template3.html'
}, {
path: 'template4.html'
}];
this.move12 = function() {
this.contents2.push(this.contents1.pop());
};
this.move21 = function() {
this.contents1.push(this.contents2.pop());
};
this.naiveMove12 = function() {
var $elem = $($element);
$elem.find('container-list:eq(0) > div').last()
.appendTo($elem.find('container-list').eq(1));
};
this.naiveMove21 = function() {
var $elem = $($element);
$elem.find('container-list:eq(1) > div').last()
.appendTo($elem.find('container-list').eq(0));
};
this.logScope = function() {
var $elem = $($element);
[].forEach.call($elem.find('container-list'), function (elem, idx) {
console.log(idx + ': ', angular.element(elem).isolateScope().containerListCtrl);
});
};
}]);
而不是移動的東西,你可以不只是在一個單身工廠的數據。使用該工廠也可以作爲事件聚合器。然後,當您想要移動數據時,您可以簡單地將其從一箇中移除並將其加載到另一箇中。任何狀態都可以與事件一起發送。如果你還想加載不同的模板,你可以使用'$ templateProvider'和'$ compile'。 –
加載數據後,將其緩存在$ rootScope中,然後您將可以在所有控制器中訪問它。我嘗試將$ rootScope添加到你的重擊程序中,但它似乎沒有工作。如果你對這種方法感興趣,我可以向你展示它的代碼。 – jjbskir
想我在下面回答你的問題。查看plunkr的工作解決方案。如果您有任何問題或者我誤解了任何內容,請告訴我。謝謝! – jbmilgrom