2015-11-26 2 views
2

У меня есть массив объектов, которые представлены пользователю как блоки. Они могут перетаскивать, чтобы изменить порядок появления этих блоков, а затем я хочу изменить положение объектов в массиве.Невозможно изменить порядок массива объектов в JS

$scope.myArray = [{a:1,b:2,c:3}, {a:11,b:22,c:33}, {a:111,b:222,c:333}]; 

function orderChanged(event) { 
    console.log($scope.myArray); 
    //logs [{a:1,b:2,c:3}, {a:11,b:22,c:33}, {a:111,b:222,c:333}] 

    console.log("source:", event.source.index, "dest:", event.dest.index); 
    //logs source: 1 dest: 2 

    $scope.myArray.move(event.source.index, event.dest.index); 

    console.log($scope.myArray); 
    //logs [{a:1,b:2,c:3}, {a:11,b:22,c:33}, {a:111,b:222,c:333}] 
}; 

//this is going to rearrange the array 
Array.prototype.move = function (from, to) { 
    this.splice(to, 0, this.splice(from, 1)[0]); 
}; 

Событие orderChange имеет индекс источника и индекс назначения в виде целых чисел, которые представляют их порядок в настоящее время для пользователя, который также отображает на свои позиции в массиве, прежде чем любой движущийся произошло.

Я не могу заставить массив переупорядочивать, каждый раз, когда я регистрирую массив в функции orderChange, оба журнала возвращают один и тот же порядок.

Все остальные примеры переназначения массива предназначены для массивов, которые не содержат объектов, мне интересно, является ли это тем, что испортило мой код?

+0

Попробуйте поставить console.log (это); в теле функции перемещения Javascript это иногда путает ^^ – Noctisdark

+0

Вы используете AngularJS. Почему вы возитесь с DOM? Добавьте свойство под названием «Заказ» к каждому из ваших объектов и позвольте Angular сделать синхронизацию ... это то, что предназначено для. – Vi100

+0

@ Vi100 Вы можете уточнить, что вы имеете в виду? – tester123

ответ

0

Я тестирую ваш код и работает нормально. Где вы модифицируете прототип Array? Просто попробуйте заменить вызов move() кодом, который фактически переупорядочивает и проверяет ...

В любом случае, вы используете AngularJS. Почему вы возитесь с DOM? Добавьте свойство под названием «Заказ» к каждому из ваших объектов и позвольте Angular сделать синхронизацию ... это то, что предназначено для.

Короче говоря, посмотрите на этот модуль, может быть, это сделает вашу жизнь проще:

http://ngmodules.org/modules/ng-sortable

+0

Я сбивал с толку, где я поставил журналы, вы направили меня, чтобы понять это с вашими комментариями. благодаря – tester123

0

Я думаю, ваш код работает нормально, но журнал не делает.

console.log может не представлять значения во время выполнения, но в режиме просмотра, особенно с многомерными объектами и массивами.

Пробуйте журнал, чтобы увидеть console.log($scope[0].a, $scope[1].a, $scope[2].a)

Вы можете проверить в другом brwoser, так как это, кажется, проблема с Chrome, смотрите здесь:
Is Chrome's JavaScript console lazy about evaluating arrays?
Wrong value in console.log

Смежные вопросы