Global CRUD Ember.js
我想知道是否有人能给我简要的指示。我正在制作一个应用程序,我希望能够在应用程序(CRUD)中的任何位置记录笔记。我正在使用{{render}}在我的应用程序控制器中呈现我的演示文稿,但我不确定如何将完整的crud操作也放在那里。这就是我到目前为止所做的: --演示控制器Global CRUD Ember.js,ember.js,ember-data,crud,ember-cli,Ember.js,Ember Data,Crud,Ember Cli,我想知道是否有人能给我简要的指示。我正在制作一个应用程序,我希望能够在应用程序(CRUD)中的任何位置记录笔记。我正在使用{{render}}在我的应用程序控制器中呈现我的演示文稿,但我不确定如何将完整的crud操作也放在那里。这就是我到目前为止所做的: --演示控制器 import Ember from 'ember'; var PresentationController = Ember.ObjectController.extend({ actions: { edit: fu
import Ember from 'ember';
var PresentationController = Ember.ObjectController.extend({
actions: {
edit: function () {
this.transitionToRoute('presentation.edit');
},
save: function () {
var presentation = this.get('model');
// this will tell Ember-Data to save/persist the new record
presentation.save();
// then transition to the current user
this.transitionToRoute('presentation', presentation);
},
delete: function () {
// this tells Ember-Data to delete the current user
this.get('model').deleteRecord();
this.get('model').save();
// then transition to the users route
this.transitionToRoute('presentations');
}
}
});
export default PresentationController;
import Ember from 'ember';
var PresentationsController = Ember.ArrayController.extend({
actions: {
sendMessage: function ( message ) {
if ( message !== '') {
console.log( message );
}
}
}
});
export default PresentationsController;
--演示控制器
import Ember from 'ember';
var PresentationController = Ember.ObjectController.extend({
actions: {
edit: function () {
this.transitionToRoute('presentation.edit');
},
save: function () {
var presentation = this.get('model');
// this will tell Ember-Data to save/persist the new record
presentation.save();
// then transition to the current user
this.transitionToRoute('presentation', presentation);
},
delete: function () {
// this tells Ember-Data to delete the current user
this.get('model').deleteRecord();
this.get('model').save();
// then transition to the users route
this.transitionToRoute('presentations');
}
}
});
export default PresentationController;
import Ember from 'ember';
var PresentationsController = Ember.ArrayController.extend({
actions: {
sendMessage: function ( message ) {
if ( message !== '') {
console.log( message );
}
}
}
});
export default PresentationsController;
--型号
import DS from 'ember-data';
var Presentation = DS.Model.extend({
title: DS.attr('string'),
note: DS.attr('string')
});
--演示路线
import Ember from 'ember';
var PresentationsRoute = Ember.Route.extend({
model: function() {
return this.store.find('presentation');
}
});
export default PresentationsRoute;
import Ember from 'ember';
var PresentationRoute = Ember.Route.extend({
model: function (params) {
return this.store.find('presentation', params.id);
}
});
export default PresentationRoute;
import Ember from 'ember';
export default Ember.Route.extend({
model: function () {
return this.store.find('category');
},
setupController: function (controller, model) {
this._super(controller, model);
controller.set('product', this.store.find('product'));
controller.set('presentation', this.store.find('presentation'));
}
});
--演示路线
import Ember from 'ember';
var PresentationsRoute = Ember.Route.extend({
model: function() {
return this.store.find('presentation');
}
});
export default PresentationsRoute;
import Ember from 'ember';
var PresentationRoute = Ember.Route.extend({
model: function (params) {
return this.store.find('presentation', params.id);
}
});
export default PresentationRoute;
import Ember from 'ember';
export default Ember.Route.extend({
model: function () {
return this.store.find('category');
},
setupController: function (controller, model) {
this._super(controller, model);
controller.set('product', this.store.find('product'));
controller.set('presentation', this.store.find('presentation'));
}
});
--申请路线
import Ember from 'ember';
var PresentationsRoute = Ember.Route.extend({
model: function() {
return this.store.find('presentation');
}
});
export default PresentationsRoute;
import Ember from 'ember';
var PresentationRoute = Ember.Route.extend({
model: function (params) {
return this.store.find('presentation', params.id);
}
});
export default PresentationRoute;
import Ember from 'ember';
export default Ember.Route.extend({
model: function () {
return this.store.find('category');
},
setupController: function (controller, model) {
this._super(controller, model);
controller.set('product', this.store.find('product'));
controller.set('presentation', this.store.find('presentation'));
}
});
--应用HBS
<section class="main-section">
<div id="main-content">
{{#link-to "presentations.create" class="create-btn expand" tagName="button"}} Add presentation {{/link-to}}
{{render 'presentations' presentation}}
{{outlet}}
</div>
</section>
{{#each presentation in controller}}
{{#link-to 'presentation' presentation tagName='li'}}
{{presentation.title}}
{{/link-to}}
{{/each}}
{{outlet}}
{{outlet}}
<div class="user-profile">
<h2>{{title}}</h2>
<p>{{note}}</p>
<div class="btn-group">
<button {{action "edit" }}>Edit</button>
<button {{action "delete" }}>Delete</button>
</div>
</div>
--哈佛商学院演示文稿
<section class="main-section">
<div id="main-content">
{{#link-to "presentations.create" class="create-btn expand" tagName="button"}} Add presentation {{/link-to}}
{{render 'presentations' presentation}}
{{outlet}}
</div>
</section>
{{#each presentation in controller}}
{{#link-to 'presentation' presentation tagName='li'}}
{{presentation.title}}
{{/link-to}}
{{/each}}
{{outlet}}
{{outlet}}
<div class="user-profile">
<h2>{{title}}</h2>
<p>{{note}}</p>
<div class="btn-group">
<button {{action "edit" }}>Edit</button>
<button {{action "delete" }}>Delete</button>
</div>
</div>
{{outlet}
{{title}}
{{note}}
编辑
删除
基本上你所描述的是一种模式。无论您查看的是哪一页(路线),都可以访问它,并且您将能够在此模式下执行操作(创建注释、编辑注释、删除注释等),而不会离开或影响后台显示的当前页面。从本质上说,这意味着你应该让路由器单独呆着,因为路由器是控制当前页面的,你不想影响它。您不希望有任何{{{#link to}}
或转接到
或转接路线
呼叫,也不希望有任何与演示相关的路线或网点
相反,您必须在控制器和视图级别处理所有事情。这就是组件真正派上用场的地方,因为如果您正确使用它们,它们对于封装非常有用。在presentations.hbs中,我将使用组件来表示每个演示:
{{#each presentation in controller}}
{{individual-presentation presentationModelBinding="presentation"}}
{{/each}}
请注意,您需要一个相应的IndividualPresentationComponent
对象来扩展Ember.Component
。更进一步说,在individual-presentation.hbs中,我的代码与您现在的代码类似,但考虑到各种CRUD操作:
{{#if editing}}
{{input value=presentationModel.title}}
{{textarea value=presentationModel.note}}
{{else}}
<h2>{{title}}</h2>
<p>{{note}}</p>
{{/if}}
<div class="btn-group">
{{#if editing}}
<button {{action "save" }}>Save</button>
{{else}}
<button {{action "edit" }}>Edit</button>
{{/if}}
<button {{action "delete" }}>Delete</button>
</div>
注意,我在这里使用的是sendAction
。这就是组件与外部世界通信的方式。要使其正常工作,请返回您的presentations.hbs并截取如下操作:
{{#each presentation in controller}}
{{individual-presentation presentationModelBinding="presentation"
save="savePresentation"
delete="deletePresentation"}}
{{/each}}
这里您基本上是说,如果组件发送“保存”操作,您希望使用控制器的“保存演示”操作来处理它,如果组件发送“删除”操作,您希望使用控制器的“删除演示”操作来处理它。因此,您的presentations-controller.js需要执行以下操作:
var PresentationsController = Ember.ArrayController.extend({
actions: {
savePresentation: function (presentationModel) {
...
},
deletePresentation: function (presentationModel) {
...
},
}
});
您可以删除
PresentationController
,因为它的所有功能现在都直接由您的IndividualPresentationComponent
和您的PresentationController
处理,基本上您所描述的是一种模式。无论您查看的是哪一页(路线),都可以访问它,并且您将能够在此模式下执行操作(创建注释、编辑注释、删除注释等),而不会离开或影响后台显示的当前页面。从本质上说,这意味着你应该让路由器单独呆着,因为路由器是控制当前页面的,你不想影响它。您不希望有任何{{{#link to}}
或转接到
或转接路线
呼叫,也不希望有任何与演示相关的路线或网点
相反,您必须在控制器和视图级别处理所有事情。这就是组件真正派上用场的地方,因为如果您正确使用它们,它们对于封装非常有用。在presentations.hbs中,我将使用组件来表示每个演示:
{{#each presentation in controller}}
{{individual-presentation presentationModelBinding="presentation"}}
{{/each}}
请注意,您需要一个相应的IndividualPresentationComponent
对象来扩展Ember.Component
。更进一步说,在individual-presentation.hbs中,我的代码与您现在的代码类似,但考虑到各种CRUD操作:
{{#if editing}}
{{input value=presentationModel.title}}
{{textarea value=presentationModel.note}}
{{else}}
<h2>{{title}}</h2>
<p>{{note}}</p>
{{/if}}
<div class="btn-group">
{{#if editing}}
<button {{action "save" }}>Save</button>
{{else}}
<button {{action "edit" }}>Edit</button>
{{/if}}
<button {{action "delete" }}>Delete</button>
</div>
注意,我在这里使用的是sendAction
。这就是组件与外部世界通信的方式。要使其正常工作,请返回您的presentations.hbs并截取如下操作:
{{#each presentation in controller}}
{{individual-presentation presentationModelBinding="presentation"
save="savePresentation"
delete="deletePresentation"}}
{{/each}}
这里您基本上是说,如果组件发送“保存”操作,您希望使用控制器的“保存演示”操作来处理它,如果组件发送“删除”操作,您希望使用控制器的“删除演示”操作来处理它。因此,您的presentations-controller.js需要执行以下操作:
var PresentationsController = Ember.ArrayController.extend({
actions: {
savePresentation: function (presentationModel) {
...
},
deletePresentation: function (presentationModel) {
...
},
}
});
您可以删除
PresentationController
,因为它的所有功能现在都直接由您的IndividualPresentationComponent
和您的PresentationController
处理,基本上您所描述的是一种模式。无论您查看的是哪一页(路线),都可以访问它,并且您将能够在此模式下执行操作(创建注释、编辑注释、删除注释等),而不会离开或影响后台显示的当前页面。从本质上说,这意味着你应该让路由器单独呆着,因为路由器是控制当前页面的,你不想影响它。您不希望有任何{{{#link to}}
或转接到
或转接路线
呼叫,也不希望有任何与演示相关的路线或网点
相反,您必须在控制器和视图级别处理所有事情。这就是组件真正派上用场的地方,因为如果您正确使用它们,它们对于封装非常有用。在presentations.hbs中,我将使用组件来表示每个演示:
{{#each presentation in controller}}
{{individual-presentation presentationModelBinding="presentation"}}
{{/each}}
请注意,您需要一个相应的IndividualPresentationComponent
对象来扩展Ember.Component
。更进一步说,在individual-presentation.hbs中,我的代码与您现在拥有的代码类似,但允许