2015-12-10 2 views
0

У меня довольно простое приложение ember-cli (с использованием Ember 2.2 & Ember Data 2.2.1) с одной моделью под названием «сценарий». У меня есть имя маршрута «сценарии», в котором перечислены все сценарии. Все это прекрасно работает. В моем шаблоне приложения у меня есть панель навигации с кнопкой, которая запускает действие для удаления всех сценариев. Мой код контроллер приложения выглядит следующим образом для этого действия:не может получить store.findAll для работы

this.store.findAll('scenario').then(function(recs){ 
    recs.forEach (function (rec) { 
     rec.destroyRecord(); 
     }); 
    }, console.log ('findAll Scenario failed')); 

Когда я запускаю этот код, то console.log всегда печатает, что указывает на то, что обещание вернулся не выполнил. Но в сценарийной модели есть четкие записи. Я вижу их на экране в маршруте «сценарии», а также в инспекторе Ember. Почему этот «findAll» не выполняет?

Еще одна вещь, которую следует отметить: когда этот код запущен, Ember Inspector фактически показывает, что те же записи, которые я пытаюсь удалить, были добавлены. (например, если у меня есть 2 сценария с идентификаторами 23 & 24 соответственно, сначала я вижу две строки в Ember Inspector, как и ожидалось. После этого кода я вижу 4 строки, два с id 23 и два с id 24). Но колонка «МОДЕЛЬ ТИПЫ» в Ember инспектора по-прежнему говорит, что сценарий (2), что указывает только 2 записей. Каждый знает, что происходит?

Update (подробнее)

Если я делаю выгрузку следующим образом вместо этого «FindAll» фрагмент кода:

this.store.unload('scenario'); 

Я все еще вижу строки в Ember инспектора, но столбец «MODEL TYPE» фактически показывает «сценарий (0)», а записи больше не отображаются в «сценарии», что хорошо. Конечно, когда я делаю обновление, записи возвращаются, поскольку сервер никогда не был уведомлен чтобы удалить эти записи. По какой-то причине выполнение вышеуказанного выражения «выгрузить» после фрагмента кода «findAll» не имеет никакого эффекта.

Update (подробнее)

Также пробовал:

this.store.findAll('scenario').then(function(recs){ 
    recs.forEach (function (rec) { 
     Ember.run.once (this, function() { 
     rec.destroyRecord(); 
     }); 
     }); 
    }, console.log ('findAll Scenario failed')); 

же ошибка.

Подробнее Обновление

надзора с моей стороны на вызов console.log. Я сделал так, как предложил Питер и изменил мой код на следующее:

this.store.findAll('scenario').then(function(recs){ 
    recs.forEach (function (rec) { 
     Ember.run.once (this, function() { 
     rec.destroyRecord(); 
     console.log ('found'); 
     }); 
     }); 
    }, function() { 
     console.log ('findAll Scenario failed'); 
    } 
); 

Этот код проверял findВсе найденные записи. Но исходная проблема сохраняется только с немного отличающимися симтомами. Я добавил две записи, а затем выполнил приведенный выше код. Вместо того, чтобы удалять эти две записи, Эмбер добавил две строки по-прежнему; «ТИП МОДЕЛИ» по-прежнему показал сценарий (2). Но если я снова запустил этот же код, «ТИП МОДЕЛИ» перешел к сценарию (0), и записи больше не показывались в маршруте сценариев. Но 4 ряда остались в инспекторе Эмбера.

Я думаю, что где-то есть ошибка в Ember Data. Но это сложно сделать, чтобы сообщить об этом.

ответ

1

Вы используете инструкцию console.log, где вы должны иметь функцию обратного вызова. Следовательно, всегда будет выполняться findAll Scenario failed.

Попробуйте это:

this.store.findAll('scenario').then(
    function(recs){ 
     recs.forEach (function (rec) { 
      Ember.run.once (this, function() { 
       rec.destroyRecord(); 
      }); 
     }); 
    }, function() { // <-- callback 
     console.log ('findAll Scenario failed'); 
    } 
); 
+0

Спасибо Питеру. См. Мое обновление выше. – ptmoy2

0

Обещание-х then принимает две функции как ее параметры - одна функция, которая будет получать выполняется, если она будет успешной, а другая функция, которая выполняется, если он выходит из строя. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then

Как показал Петтер, вам нужно поставить свой console.log внутри функции. То, что вы могли бы также сделать, это объявить две функции на вашем контроллере, например didFindScenarios и didNotFindScenarios, и передать их в функцию then, хотя важно называть их .bind(this), если вы хотите убедиться, что они имеют правильную ссылку this контроллер приложения.

Например, в контроллере приложения:

didFindScenarios: function(recs){ 
    recs.forEach (function (rec) { 
    Ember.run.once (this, function() { 
     rec.destroyRecord(); 
    }); 
    }); 
    this.set('isProcessing', false); //we have the 'this' that refers to this application controller since we called `.bind(this)` on this function 
}, 

didNotFindScenarios: function(err){ 
    console.log ('findAll Scenario failed. Here is the error: ' + err); 
    this.set('isProcessing', false); 
}, 

actions: { 
    deleteAllScenarios: function(){ 
     this.set('isProcessing', true); //just an example using 'this' 
     this.store.findAll('scenario').then(this.didFindScenarios.bind(this), this.didNotFindScenarios.bind(this)); 
    }, 
} 
+0

См. Обновление выше. – ptmoy2

+0

Возможно, сначала вызовите 'toArray' на' recs' перед вызовом 'forEach'? См. Это сообщение: http://stackoverflow.com/a/25715887/2415849 – kevinyuliawan

+0

Пробовал метод toArray, упомянутый в вашем комментарии. К сожалению, это тоже не работает. – ptmoy2

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