2014-09-10 3 views
1

Я новичок в Ember и разрабатываю простое приложение, которое взаимодействует с пользователем через форму. Если пользователь нажимает «reset», я хочу сбросить модель до исходных данных.Как клонировать модель шаблона?

Для этого я клонирую модель и устанавливаю ее в контроллер как «oldModel». Если пользователь нажимает кнопку «Сброс», я хочу заменить модель на oldModel.

jsbin: http://jsbin.com/EJISAne/673/edit

Пожалуйста, предложите мне, как я могу добиться этого, следуя передовым опытом.

ответ

1

В вашем setupController, изменить

controller.set('oldModel', Ember.copy(model)); 

в

controller.set('oldModel', Ember.copy(model,true)); 

Опция true является ключевым здесь. Это сделает глубокий клон объекта.

Также была напечатана опечатка в вашем шаблоне.

<button action 'reset'>Reset</button> 

должен быть

<button {{action 'reset'}}>Reset</button> 

Работа jsbin.

EDIT: Раннее jsbin также бросало это утверждение. Утверждение было выбрано потому, что Ember.Object не реализует Ember.Copyable mixin, как сказано в исключении.

В методе App.parseSource

arr.push(Ember.Object.create(item)) 

может быть изменен только,

arr.push(item) 

Это не бросать никаких исключений в качестве проверки для реализации копии будет сделано только для случаев Ember ,Объект

Update jsbin без исключения

+0

я воспроизвожу исключение в этом бункере http://jsbin.com/EJISAne/686/edit. Пожалуйста помогите – Susai

0

Ive реализован мой сброс как этот

Моего ROUTE Свойство «routeHasBeenLoaded» теперь позволяет пользователю изменять маршруты и вернуться к маршруту без потери каких-либо данных, ранее вставленных. С другой стороны, никакие свойства не должны устанавливаться вручную после «сохранения, редактирования» , например this.set('property1', []); после того, как сохранение не требуется. Все, что вам сделать, это this.set('routeHasBeenLoaded', null);

import RouteResetter from 'appkit/misc/resetmixin'; 
    export default Ember.Route.extend(Ember.SimpleAuth.AuthenticatedRouteMixin, RouteResetter, { 
     model : function(){ 
      var self = this; 
      if(Ember.isNone(self.get('controller.routeHasBeenLoaded'))){ 
      return Ember.RSVP.hash({ 
       property1: this.store.findAll('das/dasdasfa'), 
       property2: [], 
      }); 
      } else { 
      return; 
      } 
     } 
    }); 

Контроллер на нагрузке

routeHasBeenLoaded : null, 

    init : function(){  
    this._super(); 
    this.set('routeHasBeenLoaded', true); 
    }, 

RouteResetterMixin

export default Ember.Mixin.create({ 
    theModel: null, 
    theModelFunction : null, 

    afterModel : function(model){ 
     this._super(); 
     this.set('theModel', model); 
     this.set('theModelFunction', this.model.bind(this)); 
    }, 
    actions : { 
     triggerReset : function(){ 
     var self = this; 
     this.get('theModelFunction')().then(function(resolvedModel){ 
      self.set('controller.model', resolvedModel); 
      self.set('controller.routeHasBeenLoaded', true); 
     }); 
     } 
    } 

}); 

Так им хранить свою щёток модели, а также модели(); который я получаю послеModel hook из параметра (модели). И при перезагрузке я возвращаю модель к начальной дате. Надеюсь, это поможет. Хотелось бы увидеть и другие решения.