我是Ember的新手,正在开发通过表单与用户互动的简单应用。如果用户点击“重置”#39;我想将模型重置为初始数据。
为实现这一目标,我正在克隆模型并将控制器设置为“旧模型”。如果用户单击重置,我想用oldModel替换模型。
jsbin:http://jsbin.com/EJISAne/673/edit
请建议我如何通过遵循最佳做法来实现这一目标。
答案 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钩子。在重置时,我将模型重置为初始日期。 我希望这有帮助。 希望看到其他解决方案。