AngularJS에서 정렬 가능한 ng : repeats 드래그 앤 드롭?
그것은 사용하는 모든 쉬운에 있습니다 jQuery.sortable
에 ng-repeat
AngularJS와의 요소?
항목을 다시 정렬하면 해당 순서가 소스 배열에 자동으로 전파되면 멋질 것입니다. 그래도 두 시스템이 싸울 까 두렵습니다. 이 작업을 수행하는 더 좋은 방법이 있습니까?
Angular UI에는 정렬 가능한 지시문 이 있습니다. 데모를 보려면 여기를 클릭하십시오.
ui-sortable 에있는 코드 , 사용법 :
<ul ui-sortable ng-model="items">
<li ng-repeat="item in items">{{ item }}</li>
</ul>
나는 똑같이 시도했고 다음과 같은 해결책을 찾았습니다.
angular.directive("my:sortable", function(expression, compiledElement){
return function(linkElement){
var scope = this;
linkElement.sortable(
{
placeholder: "ui-state-highlight",
opacity: 0.8,
update: function(event, ui) {
var model = scope.$tryEval(expression);
var newModel = [];
var items = [];
linkElement.children().each(function() {
var item = $(this);
// get old item index
var oldIndex = item.attr("ng:repeat-index");
if(oldIndex) {
// new model in new order
newModel.push(model[oldIndex]);
// items in original order
items[oldIndex] = item;
// and remove
item.detach();
}
});
// restore original dom order, so angular does not get confused
linkElement.append.apply(linkElement,items);
// clear old list
model.length = 0;
// add elements in new order
model.push.apply(model, newModel);
// presto
scope.$eval();
// Notify event handler
var onSortExpression = linkElement.attr("my:onsort");
if(onSortExpression) {
scope.$tryEval(onSortExpression, linkElement);
}
}
});
};
});
다음과 같이 사용됩니다.
<ol id="todoList" my:sortable="todos" my:onsort="onSort()">
꽤 잘 작동하는 것 같습니다. 트릭은 모델을 업데이트하기 전에 sortable로 만든 DOM 조작을 실행 취소하는 것입니다. 그렇지 않으면 agular가 DOM에서 비 동기화됩니다.
변경 사항 알림은 컨트롤러 메서드를 호출 할 수있는 my : onsort 표현식을 통해 작동합니다.
I created a JsFiddle based on the angular todo tutorial to shows how it works: http://jsfiddle.net/M8YnR/180/
This is how I am doing it with angular v0.10.6. Here is the jsfiddle
angular.directive("my:sortable", function(expression, compiledElement){
// add my:sortable-index to children so we know the index in the model
compiledElement.children().attr("my:sortable-index","{{$index}}");
return function(linkElement){
var scope = this;
linkElement.sortable({
placeholder: "placeholder",
opacity: 0.8,
axis: "y",
update: function(event, ui) {
// get model
var model = scope.$apply(expression);
// remember its length
var modelLength = model.length;
// rember html nodes
var items = [];
// loop through items in new order
linkElement.children().each(function(index) {
var item = $(this);
// get old item index
var oldIndex = parseInt(item.attr("my:sortable-index"), 10);
// add item to the end of model
model.push(model[oldIndex]);
if(item.attr("my:sortable-index")) {
// items in original order to restore dom
items[oldIndex] = item;
// and remove item from dom
item.detach();
}
});
model.splice(0, modelLength);
// restore original dom order, so angular does not get confused
linkElement.append.apply(linkElement,items);
// notify angular of the change
scope.$digest();
}
});
};
});
Here's my implementation of sortable Angular.js directive without jquery.ui :
you can go for ng-sortable directive which is lightweight and it does not uses jquery. here is link ng-sortable drag and drop elements
참고URL : https://stackoverflow.com/questions/7354992/drag-and-drop-sortable-ngrepeats-in-angularjs
'programing' 카테고리의 다른 글
Python 느린 읽기 성능 문제 (0) | 2020.12.02 |
---|---|
C ++ and, or, not, xor 키워드 (0) | 2020.12.02 |
HTML 페이지의 div에 외부 웹 페이지를로드하는 방법 (0) | 2020.12.01 |
HTML을 렌더링하지 않고 React를 사용할 수 있습니까? (0) | 2020.12.01 |
Swift를 웹 프로그래밍 언어로 사용할 수 있습니까? (0) | 2020.12.01 |