2015-05-13 2 views
1

Здесь я достаю список сделок и показываем их в ионном списке с шоу-повторным заказом включен

var ref = fb.child("/members/" + fbAuth.uid + "/accounts/" + $scope.AccountId + "/transactions/"); 
$scope.transactions = $firebaseArray(ref); 

У меня есть следующий код для обработки сортировки

$scope.moveItem = function (transaction, fromIndex, toIndex) { 
     $scope.transactions.splice(fromIndex, 1); 
     $scope.transactions.splice(toIndex, 0, transaction); 
}; 

Я знаю, что приближаюсь к этому неправильно, читая docs here. Однако мне не удалось найти способ сортировки элементов (транзакций в моем случае) и сохранить эти изменения обратно в Firebase. Вы можете помочь?

UPDATE

На основе замечаний Франк ван Puffelen ниже, я добавляю дополнительную информацию. В качестве примера возьмем следующие транзакции. Я вытаскиваю следующие транзакции из Firebase, и я заказываю их с помощью «customIndex». Так что, если я "движение" customindex: "5" (Старбакс сделки) между customindex: "1" (McDonalds) и customindex: "2" (Walmart)

{ 
"accounts": {"Checking": 
    {payee: "McDonalds", amount: "2.35", customindex: "1"} 
    {payee: "Walmart", amount: "78.12", customindex: "2"} 
    {payee: "CapitalOne", amount: "150.00", customindex: "3"} 
    {payee: "FootLocker", amount: "107.54", customindex: "4"} 
    {payee: "Starbucks", amount: "2.88", customindex: "5"} 
}} 

я в конечном итоге со следующими данными в Firebase :

{ 
"accounts": {"Checking": 
    {payee: "McDonalds", amount: "2.35", customindex: "1"} 
    {payee: "Starbucks", amount: "2.88", customindex: "2"} 
    {payee: "Walmart", amount: "78.12", customindex: "3"} 
    {payee: "CapitalOne", amount: "150.00", customindex: "4"} 
    {payee: "FootLocker", amount: "107.54", customindex: "5"} 
}} 

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

+0

Ничто в вашем коде не делает заказ. На что вы пытаетесь заказать транзакции? –

ответ

0

Чтобы заказать товары, оставьте это для Firebase. Например, что вы хотите сделки должны быть упорядочены по дате создания, вы можете:

var ref = fb.child("members") 
      .child(fbAuth.uid) 
      .child("accounts") 
      .child($scope.AccountId) 
      .child("transactions") 
      .orderByChild("creationDate"); 
$scope.transactions = $firebaseArray(ref); 

Если это не распространяется на то, что вы хотите, пожалуйста, обновите ваш вопрос понятнее о том, что вы пытаетесь сортировать по , Прямо сейчас, я не знаю, что вы пытаетесь сортировать.

Update

Я просто заметил ваше обновление и что на самом деле проясняет, что вы пытаетесь достичь.

В вашем первом фрагменте данных данные упорядочиваются по customindex. Так что вы можете получить их в таком порядке:

var ref = fb.child("members") 
      .child(fbAuth.uid) 
      .child("accounts") 
      .child($scope.AccountId) 
      .child("transactions") 
      .orderByChild("customindex"); 
$scope.transactions = $firebaseArray(ref); 

В ваших последних данных фрагмент кода, операции больше не упорядочены по какой-либо собственности. Поэтому, когда пользователь перетаскивает транзакцию Starbucks со своего последнего места и бросает ее на второе место, вам нужно будет обновить свойство customindex всех транзакций после него. Если вы обновите эти значения, AngularFire автоматически гарантирует, что элементы находятся в правильном порядке в $firebaseArray снова.

Обратите внимание, что для этого требуется обновить 4 транзакции, которые могут быть не очень эффективными. В качестве альтернативы вы можете:

  1. сохранить информацию о транзакции (то, что вы изначально имели) и порядок транзакций в отдельных узлах. Таким образом вам нужно будет только обновить узел transaction_order.
  2. Сохраните некоторое пространство между вашими начальными индексами. Поэтому вместо [1,2,3,4,5], начните с [10,20,30,40,50]. Затем, когда пользователь перемещает Starbucks между 20 и 30, вы можете просто обновить транзакцию Starbucks customindex до 25: [10,20,25,30,40,50].Этот подход немного взломан, но его проще реализовать и он будет работать нормально.
+0

Вот пример того, что я хочу выполнить с кнопкой ионного переупорядочения [Нажмите здесь] (http://ionicframework.com/docs/api/directive/ionReorderButton/) Но мне нужно сохранить изменения в Firebase –

+0

[Docs here] (https://www.firebase.com/docs/web/libraries/angular/guide/synchronized-arrays.html#section-modification-the-array) скажите, что я не могу использовать splice(), поскольку он не контролируется AngularFire. Но я не знаю, что использовать. –

+0

То, что я не знаю, это то, что вы хотите заказать. В коллекциях Firebase элементы * not * упорядочены по индексу массива, но некоторым другим свойством. Это значение по умолчанию относится к ключу, но может быть изменено любым из методов 'orderBy', как тот, который я добавил в свой фрагмент. Если ваш ответ действительно является «Я хочу заказать по индексу», добавьте свойство «index» к вашим элементам и обработайте это. –

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