少し説明が難しいのですが、なるべくコードなども簡略化してみますので、読んでくだされば幸いです(T_T)
https://github.com/holiber/sl-vue-tree
↑こちらの、リストのソートをするライブラリを使用しました。
typescript
1//拡張子は.vueです。vueクラスコンポーネントを使ってます。 2 3<template> 4 <div class="objectList"> 5 <div class="objectArea"> 6 <SlVueTree ref="SlVueTree" v-model="objectList"> 7 8 </SlVueTree> 9 </div> 10 </div> 11</template> 12 13<script lang="ts"> 14import { Component, Prop, Vue } from "vue-property-decorator"; 15 16import SlVueTree from 'sl-vue-tree' 17 18 19@Component({ 20 components: { 21 SlVueTree 22 } 23}) 24 25export default class ObjectList extends Vue { 26 27 28 get objectList() { 29 return this.$store.getters.objectList; 30 } 31 32 set objectList(updatedObjectList) { 33 this.$store.dispatch('edit/sortObjectList' , updatedObjectList) 34 } 35} 36</script> 37 38<style lang="scss"> 39 40</style> 41 42
vuexとこちらのライブラリを組み合わせる場合、上のように、getとsetを使います。
setはドラッグ&ドロップした時に呼ばれます。
set objectList(updatedObjectList) {
this.$store.dispatch('edit/sortObjectList' , updatedObjectList)
}
↑ここでは、ソートされた結果(updatedObjectList)を元々のobjectListに格納しています。
(objectList = updatedObjectListみたいなことをする)
そうすることで、
get objectList() {
return this.$store.getters.objectList;
}
ここが変化し、ソートができます。
データはgetとバインドされています。
しかし、こちらのライブラリ、
objectListのモデルに含まれた"関数"に関しては、updatedObjectListに入ってくれないです。
updatedObjectListに入ってくれるのはプロパティのみです。
したがって、
objectList=updatedObjectList
のように上書きするのではなく、
元々のobjectListをupdatedObjectListに従ってソートするということをしたいです。
例えば、
元々のobjectListが
typescript
1 2let objectList = [ 3 4 { 5 objectId : 1, 6 objectName : "オブジェクト1", 7 objectList : [], 8 isLeaf : false, 9 children : [] 10 }, 11 { 12 objectId : 2, 13 objectName : "オブジェクト2", 14 objectList : [], 15 isLeaf : true 16 }, 17 { 18 objectId : 3, 19 objectName : "オブジェクト3", 20 objectList : [], 21 isLeaf : false, 22 children : [] 23 }, 24 { 25 objectId : 4, 26 objectName : "オブジェクト4", 27 objectList : [], 28 isLeaf : true 29 }, 30 { 31 objectId : 5, 32 objectName : "オブジェクト5", 33 objectList : [], 34 isLeaf : false, 35 children : [] 36 }, 37 38] 39 40
で、updatedObjectListが
typescript
1 2let updatedObjectList = [ 3 { 4 objectId : 5, 5 objectName : "オブジェクト5", 6 objectList : [], 7 isLeaf : false, 8 children : [] 9 }, 10 { 11 objectId : 3, 12 objectName : "オブジェクト3", 13 objectList : [], 14 isLeaf : false, 15 children : [ 16 { 17 objectId : 2, 18 objectName : "オブジェクト2", 19 objectList : [], 20 isLeaf : true 21 }, 22 { 23 objectId : 1, 24 objectName : "オブジェクト1", 25 objectList : [], 26 isLeaf : false, 27 children : [ 28 { 29 objectId : 4, 30 objectName : "オブジェクト4", 31 objectList : [], 32 isLeaf : true 33 }, 34 ] 35 }, 36 ] 37 } 38] 39
だった場合、
objectList = updatedObjectListとするのではなく
"objectListをソートして、"updatedObjectListと同じ構造にするためにはどのようにすればよろしいでしょうか。
親になることができるobjectは
isLeaf : false
というパラメーターを持ちます。
そして、子はchildrenという名前のパラメーターに入ります。
しかし、childrenに格納することに加えて、同じものを、objectListというパラメーターに格納したいです。
linq-es2015という,typescript用のlinqモジュールも使えますので、linqを使うこともできます。
ただc#のlinqと全く同じメソッドが定義されている訳ではありません。
-追記-
dataにプロパティで任意のプロパティを持っても、関数が渡されなかった
以下はvuexのルートモデルの一部
typescript
1import { ImageObject } from './image/imageObject' 2 3import { ObjectData } from './objectData' 4 5export class Object{ 6 7 public title : string = "" 8 9 public isLeaf : boolean = true 10 11 public data : ObjectData = new ObjectData("") 12 13 constructor(object : {objectType : string , objectId : number}){ 14 15 if(object.objectType == "imageObject"){ 16 this.data = new ImageObject(object) 17 //imageObjectはobjectDataをextendしている 18 } 19 } 20 21}
typescript
1 2import { OuterRect } from './rect/outerRect' 3 4/** 挿入データ(文字とか画像とか)の状態のうち、全てのデータで共有する要素 */ 5export class ObjectData{ 6 7 public objectId : number = 0 8 9 public objectType : string = "" 10 11 public name : string = "" 12 13 public selected : boolean = false 14 15 public outerRect : OuterRect = new OuterRect("string") 16 17 constructor(objectType : string){ 18 this.objectType = objectType 19 if(objectType!=""){ 20 this.outerRect = new OuterRect(objectType) 21 } 22 } 23 24 public changeState(state : { value : string , stateType : string }){ 25 26 27 } 28 29} 30
このようにobjectDataにも関数はありますし、outerRectにも関数があるのですが、それらが順番を変えたりすると(objectList = updatedObjectListをすると)、消えてしまいます。
data.outerRect.function is not a function とエラーが出てしまいます。
-追記-
そしてやはり並び替えだとうまくいきます
typescript
1 2let objectList = this.objectList 3 4this.objectList = [] 5 6for(var i = 0; i < updatedObjectList.length; i++){ 7 this.objectList.unshift(Enumerable.asEnumerable(objectList).Where(x=>x.objectId==updatedObjectList[i].objectId).ToArray()[0]) 8} 9
ただし、これはグループ化をしておらず、一階層目だけでオブジェクトを入れ替えているだけです。
階層構造も含めて
updatedObjectと同じ構造にしたいです...
こちら、スタックオーバーフローにほとんど同じ質問をしたところ、マルチポストであるというご指摘を頂きました。
配列をソートする方法自体に関しては、スタックオーバーフローの方で回答をいただけました。

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/08/13 05:59
退会済みユーザー
2018/08/13 07:24
退会済みユーザー
2018/08/13 09:17 編集
退会済みユーザー
2018/08/13 09:30
2018/08/13 14:13
退会済みユーザー
2018/08/14 09:26 編集
2018/08/14 05:08
退会済みユーザー
2018/08/14 09:13
退会済みユーザー
2018/08/14 09:43 編集
退会済みユーザー
2018/08/14 09:53
退会済みユーザー
2018/08/14 10:31
2018/08/14 11:01
退会済みユーザー
2018/08/14 12:03 編集
2018/08/14 13:57
退会済みユーザー
2018/08/15 00:38