2015-09-29 3 views
0

Я изо всех сил стараюсь следовать ember 2.0's documentation за удаление записей, а затем перенаправление на новый URL. Когда я пытаюсь, я получаю следующую ошибку на консоли:Удалить запись в Emberjs

Error while processing route: pencils Attempted to handle event `pushedData` on <[email protected]:pencil::ember523:null> while in state root.deleted.inFlight. Error: Attempted to handle event `pushedData` on <[email protected]:pencil::ember523:null> while in state root.deleted.inFlight. 

Мои файлы следует.

Маршруты:

import Ember from 'ember'; 
import config from './config/environment'; 

var Router = Ember.Router.extend({ 
    location: config.locationType 
}); 

Router.map(function() { 
    this.resource('pencilview', { path: '/pencils/:pencil_id' }); 
    this.resource('pencilcreate', { path: '/pencils/new' }); 
    this.resource('pencils'); 
}); 


export default Router; 
import Ember from 'ember'; 
import config from './config/environment'; 

var Router = Ember.Router.extend({ 
    location: config.locationType 
}); 

Router.map(function() { 
    this.resource('pencilview', { path: '/pencils/:pencil_id' }); 
    this.resource('pencilcreate', { path: '/pencils/new' }); 
    this.resource('pencils'); 
}); 


export default Router; 

маршруты/pencilview.js

export default Ember.Route.extend({ 
    model: function(params) { 
     return this.store.find('pencil', params.pencil_id); 
    }, 

    actions: { 
     save(pencil){ 
      this.store.find('pencil', pencil.id).then(function(pencil){ 
       pencil.save(); 
      }) 
      this.transitionTo('pencils'); 
     }, 

     remove(id){ 
      this.get('store').find('pencil', id).then(function(pencil2){ 
       pencil2.destroyRecord(); 
      }); 
      this.transitionTo('pencils'); 
     }, 

     cancel(pencil){ 
      this.store.find('pencil'.pencil.id).then(function(pencil){ 
      }) 
     } 
    } 
}); 

шаблоны/pencilview.hbs

<h2>Single Pencil View</h2> 
<p>Pencil ID: {{model.id}}</p> 

<p> 
<label for='name'>Name</label> 
{{input type="text" id="name" value=model.name}}</p> 

<p> 
<label for='name2'>Name2</label> 
{{input type="text" id="n2" value=model.n2}}</p> 

<p> 
<label for='name3'>Name3</label> 
{{input type="text" id="n3" value=model.n3}}</p> 

<p><button {{action "remove" model.id}}>Delete</button></p> 
<p><button {{action "save" model}}>Save</button></p> 

{{#link-to 'pencils'}}Pencils{{/link-to}} 

контроллеры/*

all missing except for pencilcreate.js, not applicable here 

шаблон/pencils.hbs

<h2>All Pencils</h2> 
<p>{{#link-to 'pencilcreate' (query-params direction='pencils') class='btn btn-default' }}Create New Pencil{{/link-to}}</p> 

<table id='pencil_allTable' class='display'> 
<thead><tr><td>ID</td><td>Brand</td><</tr></thead> 
<tbody> 
{{#each model as |pencil|}} 
    <tr> 
    <td>{{#link-to "penciliew" pencil class='btn btn-default'}}{{pencil.id}}{{/link-to}}</td> 
    <td>{{pencil.brand}}</td> 
    </tr> 
{{/each}} 
</tbody></table> 

<script> 
$(document).ready(function() { 
    $('#pencil_allTable').DataTable(); 
    }); 
</script> 

маршруты/pencil.js

export default Ember.Route.extend({ 
    model() { 
    return this.store.findAll('pencil'); 
    } 
}); 
+0

Проверьте мой ответ. –

+0

Кажется, что ответы Генри и Торазабуро не обновляют взгляд на наркотики. То есть, «delete api» попадает, но магазин не обновляется. При переходе на «карандаши» он показывает старые данные, если я не обновляю страницу. Я награжу щедрот тому, кто обновит их ответ и сначала решает эту последнюю загадку. Если новый ответ перескакивает с конгломератом перечисленных ниже, я проверю его и даю Генри щедрость. – mh00h

+0

Я нигде не вижу никакого представления о «наркотиках». Если вы имеете в виду «карандаши», укажите маршрут, контроллер и шаблон. –

ответ

8

Это вариант другого ответа, немного подтянутого.

remove(id) { 
    this.get('store').find('pencil', id) . 
    then(pencil2 => pencil2.destroyRecord()) 
    .then(() => this.transitionTo('pencils')); 
} 
+0

см. Мой комментарий выше для дальнейшего уточнения вашего ответа. – mh00h

3

Вы были укушены this сферы в:

this.transitionTo('pencils').then(function(id){ 
    this.get('store') // <== this === undefined 

Этот код должен работать:

remove(id) { 
    this.get('store').find('pencil', id).then(pencil2 => { 
     pencil2.deleteRecord(); 
    }); 
    this.transitionTo('pencils'); 
}, 
+0

Это приводит к 'GET http://0.0.0.0:6543/api/pencils/%3Cname-emberjs%40route% 3Apencils% 3A% 3Apert590% 3E 500 (Внутренняя ошибка сервера) '. Мне интересно, нужно ли запускать save() перед переходом, но это создает другую проблему: 'Ошибка при обработке маршрута: карандаши Попытка обрабатывать событие pushedData на <имя-emberjs @ pencil :: ember549: 3> while в состоянии root.deleted.inFlight. Ошибка: Попытка обработать событие pushedData в <имя-emberjs @ model: карандаш :: ember549: 3> в то время как в состоянии root.deleted.inFlight.' – mh00h

+0

Ответ обновлен. Вы не можете получить удаленную запись, поэтому ее нельзя сохранить после ее удаления. –

+2

Это только частично работает. вызов deleteRecord() не отправляет запрос DELETE на api; это влияет только на местный магазин. Изменение 'deleteRecord()' на 'destroyRecord()' заставляет его снова отключиться, регистрируя ошибку root.deleted.inFlight'. – mh00h

3

Пусть обещание исполнить себя:

remove(id){ 
     this.get('store').find('pencil', id).then((pencil2) => { 
      pencil2.destroyRecord().then(() => { 
       this.transitionTo('pencils'); 
      }); 
     });   
    }, 

Edit: избавившись от const _this.

+2

Хороший ответ, плюс один, но незначительный nitpicking, так как мы пошли на все проблемы, чтобы иметь возможность использовать ES6 и жирные стрелки, не можем ли мы подтянуть код и избавиться от '_this' все в одно и то же время? Кроме того, может быть несколько более читаемым, чтобы вывести 'then' вместо того, чтобы вставлять их. –

+0

, см. Мой комментарий выше для дальнейшего уточнения вашего ответа. – mh00h

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