如何克隆模板的模型?

时间:2014-09-10 06:23:57

标签: ember.js

我是Ember的新手,正在开发通过表单与用户互动的简单应用。如果用户点击“重置”#39;我想将模型重置为初始数据。

为实现这一目标,我正在克隆模型并将控制器设置为“旧模型”。如果用户单击重置,我想用oldModel替换模型。

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

请建议我如何通过遵循最佳做法来实现这一目标。

2 个答案:

答案 0 :(得分: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

编辑:早期的jsbin也抛出了断言。抛出断言是因为,Ember.Object没有实现Ember.Copyable mixin,如异常中所述。

方法App.parseSource

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

可以改为just,

arr.push(item)

这不会抛出任何异常,因为仅对Ember.Object的实例执行复制实现的检查

毫无例外地更新jsbin

答案 1 :(得分:0)

我实现了我的重置

我的路线    &#34; routeHasBeenLoaded&#34; property现在允许用户更改路由,并返回路由而不会丢失先前插入的任何数据。另一方面,在&#34;保存,编辑&#34;之后,不必手动设置属性。 例如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);
        });
      } 
    }

});

所以即时存储我的初始模型以及模型();我从参数(模型)中获取了afterModel钩子。在重置时,我将模型重置为初始日期。 我希望这有帮助。 希望看到其他解决方案。