首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Dragula找出排序顺序-如何禁用

Dragula找出排序顺序-如何禁用
EN

Stack Overflow用户
提问于 2017-04-24 16:28:15
回答 1查看 3K关注 0票数 8

我使用Dragula的拖放功能。在我从服务器端刷新我的列表之前,它是工作的:

代码语言:javascript
复制
this.columnList = newValue;

它接合了Dragula想要像以前一样保留列表中的顺序,所以它扰乱了服务器端的排序顺序。我不需要这个功能。我读过文档、教程、示例,但找不到如何在Dragula中禁用自动排序。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-27 20:08:36

我很有信心没有自动排序,至少在默认情况下是这样。最少的自我包含的例子是我们的朋友。好吧,尽管网络可以使用更多的例子,虽然很难证明是否定的,但我将证明在默认情况下没有自动排序,并试图猜测问题的所在。

对不起,直到我意识到您使用的是纯JS,并且可能使用的是AngularJS而不是Angular2之后。尽管如此,下面的内容仍然应该是有用的。

首先,我们需要一个简单的代码库,让我们使用角-CLI创建基(https://www.npmjs.com/package/angular-cli):然后遵循How to set up angular-quickstart with ng2-dragula,我们将有完全相同的起始基。

现在将app.component.html的内容替换为:

代码语言:javascript
复制
<div><button (click)="inOrderGreekAlphabet()">In Order Greek Alphabet</button></div>
<div><button (click)="reversedGreekAlphabet()">Reversed Greek Alphabet</button></div>
<div><button (click)="displyStateOfItems()">Display state of Items</button></div>
<div>
    <div class='wrapper'>
        <div class='container' [dragula]='"first-bag"'  [dragulaModel]="items">
            <div *ngFor="let item of items">{{item}}</div>
        </div>
    </div>
</div>

将app.component.ts的内容替换为:

代码语言:javascript
复制
import {Component} from '@angular/core';
import {DragulaService} from 'ng2-dragula/ng2-dragula';

@Component({
    selector: 'app-root',
    templateUrl: './app.component.html',
    styleUrls: ['./app.component.css'],
    viewProviders: [DragulaService]
})
export class AppComponent {
    public items: string[];
    private GREEK_ALPHABET:string[] = ["alpha", "beta", "gamma", "delta", "epsilon", "zeta", "eta", "theta", "iota", "kappa", "lambda", "mu", "nu", "xi", "omicron", "pi", "rho", "sigma", "tau", "upsilon", "phi", "chi", "psi", "omega"];

    constructor() {
        this.inOrderGreekAlphabet();
    }

    public inOrderGreekAlphabet(){
        this.items = this.GREEK_ALPHABET.slice();
    }

    public reversedGreekAlphabet() {
        this.items = this.GREEK_ALPHABET.reverse();
    }

    public displyStateOfItems(){
        alert(JSON.stringify(this.items));
    }    
}

如果您运行上面的代码,您会发现模型与列表是同步的,就像在显示项目状态按钮中所显示的那样。但是,如果我们从app.component.html中删除[dragulaModel]="items",我们会发现模型是不同步的。这并不是说dragula在做额外的事情,而是在做一些更少的事情。

为了解决这个问题..。

在同步本地状态时,我们可以尝试以下几种方法:

首先要注意的是,虽然添加[dragulaModel]="items"会使列表与数组同步,但我们仍然需要定制服务器同步代码的挂钩,稍后将详细介绍。

如果我们忽略dragula框架,或者尝试为项创建一个getter setter。但是,如果我们将所有项的实例重命名为_items,然后添加:

代码语言:javascript
复制
//This is to demonstrate an issue, this is NOT A Solution!
get items():string[]{
    console.log("call from getter: could do server sync here?");
    return this._items;
}

set items(i:string[]){
    console.log("call from setter: or perhaps here?");
    this._items = i;
}

但是,上面的将不能工作,或者更确切地说,它可以工作,但是查看控制台日志显示,setter被调用一次,然后所有后续的访问都用getter完成,并且在拖动过程中多次调用getter,如果用户在几秒钟内可能生成数百次调用。此外,最好让用户知道是否需要保存页面,在可能没有限制的列表上进行数组比较,不确定的次数听起来并不是个好主意,尽管可能有纯粹的Java/类型记录解决方案可以解决此dragula问题,但它提供了一种方法,只在项目被删除一次时就进行检查。

添加下面的代码,替换构造函数,并删除setter/getter,因为这是一个愚蠢的想法(我们确实对drop部分感兴趣,但完整性从来不坏):

代码语言:javascript
复制
constructor(private dragulaService: DragulaService) {
    dragulaService.drag.subscribe((value) => {
        console.log(`drag: ${value[0]}`);
        this.onDrag(value.slice(1));
    });
    dragulaService.drop.subscribe((value) => {
        console.log(`drop: ${value[0]}`);
        this.onDrop(value.slice(1));
    });
    dragulaService.over.subscribe((value) => {
        console.log(`over: ${value[0]}`);
        this.onOver(value.slice(1));
    });
    dragulaService.out.subscribe((value) => {
        console.log(`out: ${value[0]}`);
        this.onOut(value.slice(1));
    });
    this.inOrderGreekAlphabet();
}

private onDrag(args) {
    let [e, el] = args;
    //do something
}

private onDrop(args) {
    let [e, el] = args;
    // do something
}

private onOver(args) {
    let [e, el, container] = args;
    // do something
}

private onOut(args) {
    let [e, el, container] = args;
    // do something
}

上面的内容取自https://github.com/valor-software/ng2-dragula#events,并提供了手动实现同步的能力,而无需使用dragulaModel指令,但我们也可以像文档演示(https://github.com/valor-software/ng2-dragula#special-events-for-ng2-dragula)的下一节所示的那样,在该指令的基础上构建该指令,因此,与其执行上述操作,我们只需要(在本例中必须使用dragulaModel指令):

代码语言:javascript
复制
constructor(private dragulaService: DragulaService) {
    dragulaService.dropModel.subscribe((value) => {
        console.log(`dropModel: ${value[0]}`);
        this.onDropModel(value);
    });
    this.inOrderGreekAlphabet();
}

private onDropModel(args){
    let [bagName, el, target, source] = args;
    //do something, such as sync items with the server.
    //or setting a flag to indicate if items is different from when it was last saved
}

你应该有个很好的解决方案。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43593338

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档