Trong ứng dụng góc, tôi muốn di chuyển một phần tử từ một phần của cây DOM sang một phần khác mà không phải tải lại bộ điều khiển được gắn vào phần tử đã di chuyển.Giữ trạng thái phần tử/phạm vi khi di chuyển bộ điều khiển trong DOM
tôi đã tạo ra một plunker đơn giản để minh họa: http://plnkr.co/edit/sqBRM3ZQ5G9xpiNd1MXm?p=preview
Trong plunker này, dữ liệu chỉ được giữ lại là trạng thái toggler, nhưng trong thực tế nó có thể là một số lượng rất lớn dữ liệu, mà có thể yêu cầu một rất nhiều nỗ lực để khởi tạo.
Điều tôi muốn làm là có thể di chuyển mẫu 1 từ chỉ thị 1 sang chỉ thị 2, nhưng tôi muốn giữ trạng thái của người chuyển đổi. Trong trường hợp này, nếu bạn nhấp vào trình chuyển đổi để làm cho màu xanh lục và nhấp vào "di chuyển từ danh sách 1 đến 2" hai lần, nó sẽ chuyển nó sang chỉ thị 2 nhưng đặt lại màu thành màu đỏ.
Để phá vỡ điều này, tôi chỉ có thể di chuyển phần tử mà không thông báo góc cạnh, nhưng điều này rõ ràng là tạo ra trạng thái ứng dụng bị hỏng.
Tôi nghĩ đến việc di chuyển bộ điều khiển từ phạm vi cũ sang phạm vi mới, nhưng tôi cảm thấy điều này sẽ gây ra sự cố đóng cửa vì bộ điều khiển cũ có thể tham chiếu đến phần tử cũ không còn trong DOM, v.v.
Có cách nào tốt đẹp để giải quyết vấn đề này không?
Thêm một số mã vì StackOverflow đòi hỏi nó, nhưng tham khảo plunker thay vì: trạng thái ứng dụng
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);
});
};
}]);
Thay vì di chuyển nội dung, bạn có thể không chỉ có dữ liệu trong một nhà máy đơn lẻ hay không. Sử dụng nhà máy đó cũng như một bộ tổng hợp sự kiện. Sau đó, khi bạn muốn di chuyển dữ liệu, bạn đơn giản xóa dữ liệu khỏi một và tải dữ liệu đó vào một tệp khác. Bất kỳ trạng thái nào cũng có thể được gửi cùng với sự kiện. Nếu bạn cũng muốn tải lên các mẫu khác nhau, bạn có thể sử dụng '$ templateProvider' và' $ compile'. –
Sau khi tải bộ nhớ cache dữ liệu trong $ rootScope, sau đó bạn sẽ có quyền truy cập vào nó trong tất cả các bộ điều khiển của bạn. Tôi đã thử thêm $ rootScope để plunker của bạn, nhưng nó dường như không được làm việc. Nếu bạn quan tâm đến cách tiếp cận này tôi có thể cho bạn thấy mã cho nó. – jjbskir
Hãy suy nghĩ tôi đã trả lời câu hỏi của bạn bên dưới. Kiểm tra các plunkr cho giải pháp làm việc. Xin vui lòng cho tôi biết nếu bạn có bất kỳ câu hỏi hoặc nếu tôi hiểu lầm bất cứ điều gì cả. Cảm ơn! – jbmilgrom