我试图理解a Route和a 之间的区别Resource.我理解的方式Resource有助于将Route对象的子路径设置为另一个Route对象.但是当我想到路径的默认名称映射时,我还不清楚.
我正在尝试为Ember.js应用程序编写一个基于custom.js的自定义服务器.我相处得很好,但是我一直在试图猜测Ember Data在特定时刻所期待的JSON响应.
这个全新的文档是一个很好的开始http://emberjs.com/guides/models/the-rest-adapter/但不够完整.
我在黑暗中的刺伤让我明白了(Ember pre4,Ember Data 11):
Context                                Server URL          Method     Req. Data                  Resp. Data
~~~~~~~                                ~~~~~~~~~~          ~~~~~~     ~~~~~~~~~                  ~~~~~~~~~~
Getting a list of all users            /users              GET                                   {"users":[{...},{...}]}
Getting a particular user              /users/123          GET                                   {"user":{...}}
Creating a user                        /users              POST       {"user":{...}}             ???
Updating a user                        /users/123          PUT        {"user":{...}}             ???
Deleting a user                        /users/123          DELETE     ???                        ???
Creating a user (bulkUpdate)           /users              POST       {"users":[{...},{...}]}    ???
Updating a user (bulkUpdate)           /users/bulk         PUT        {"users":[{...},{...}]}    ???
Deleting a user (bulkUpdate)           /users/123 …什么是"正确的方式"(或者至少是选项,如果没有单一的"Ember方式"这样做)导航侧边栏?我应该以某种方式查看ContainerViews,还是应该使用新的插座功能并将导航粘贴到我的应用程序视图中?
另外,根据URL(我正在使用路由)在li上设置.active类的"正确方法"是什么?对此有什么帮助吗?
从路线访问控制器有什么万无一失的方法吗?
<a href="#" class="btn" {{action "someAction" user}}>add</a>
App.ApplicationRoute = Ember.Route.extend
  events:
    someAction: (user) ->
      console.log 'give me name from currentUser controller'
someAction非常通用,我认为ApplicationRoute是最好的选择.
如何将环境变量从bashrc传递到Ember CLI.我想象你需要条带api键或pusher api-keys的情况,你可以在bashrc中的环境变量中使用它们.如何将api-key传递给Ember CLI.
我尝试process.env在brocfile.js和中使用Node.js environment.js,但是当我尝试在Ember JS控制器中访问它时,属性为null.
在我的environment.js文件中,我添加了,
APP: { apiKey: process.env.KEY }
在我的Ember JS控制器中,我尝试访问它:
import config from  '../config/environment'; 
并设置lkey如下所示的控制器属性,这不起作用:
lkey: config.App.KEY
接下来brocfile.js,我补充说:
var limaKey = process.env.Key; 
var app = new EmberApp({key: limaKey});
这仍然无效.
更新#2
我发现当我重构过滤逻辑发生在PostController中的复合计算属性而不是在单个路径中时,我能够让它工作.解决方案最终依赖于由特定的#linkTo路由操作设置的单个动态变量,该操作触发了PostController计算属性中的过滤更改.我有很多工作需要赶上,所以我现在无法将解决方案发布到这个具体问题,但是当我可以时,我将详细解释下面的解决方案.现在我已经将@ twinturbo的答案标记为正确的,因为他在下面给出了部分但非常有用的指导.再次感谢男人!! 非常感激!!
更新#1
最新的小提琴是在http://jsfiddle.net/aZNRu/14/与@ twinturbo的帮助,在其后期父控制器中排序注释的"rank"属性,以及基本过滤.仍然存在在过滤的路线中没有获得自动更新视图并且创建新评论的问题.
原始问题
我看到有关将可排序mixin与过滤功能相结合的讨论,但就目前而言,正如您在我的jsfiddle示例中所看到的,我在排序和过滤方面都存在问题:
1)我无法弄清楚如何按其父控制器中的特定子属性进行排序.如果我们有:
App.Post = DS.Model.extend({
    title: DS.attr('string'),
    post: DS.attr('string'),
    comments: DS.hasMany('App.Comment')
});
App.Comment = DS.Model.extend({
    post: DS.belongsTo('App.Post'),
    description: DS.attr('string'),
    isActive: DS.attr('boolean'),
    rank: DS.attr('number')
});
App.Router.map(function() {
  this.resource("posts", { path: "/" }, function() {
    this.resource('post', { path: ':post_id' }, function() {
        this.route('active');
        this.route('inactive');
     });
   });
});
我希望能够按照"rank"属性按升序对每个帖子的评论进行排序.我想做的事情如下:
App.PostController = Ember.ObjectController.extend({
    sortProperties: ['comments.rank']
但是对于一个,我认为sortProperties只适用于arrayControllers,我认为它不能超过一个级别.我怎么能实现这个目标?
2)第二个问题是在过滤后的路由中没有获得自动更新视图.例如,如果您通过单击"活动注释"查看jsfiddle并进入活动过滤路径,则会对当前数据产生良好的过滤效果.但是,如果您保持活动路径并通过单击"添加新注释"创建一个处于活动状态的新记录,则该记录不会自动呈现在"活动"下,并且仅在您单击另一个路径然后返回到该路径时才会显示.
我是否在路由中错误地设置路由过滤或在模板中引用错误?
App.PostActiveRoute = Ember.Route.extend({
  setupController: function() {
    var post = this.controllerFor('post').get('model'),
    comments = …如何在我当前的控制器中获取以前的路由器.
App.MyController = Em.ObjectController.extend({
    next:function() { // This is my action helper in HBS
        this.transitionTo('nextPage');
    },
    back:function() { // This is my action helper in HBS
        // Here I need to dynamically identify my previous route.
        // How can I get my previous route.
    }
});
我想要一个Ember路径/clinic/1自动重定向以显示第一位医生:/clinic/1/doctor/1.
每个诊所都有很多医生.
不幸的是,如果我使用此代码:
var doctor = clinicController.get('content.doctors.firstObject');
router.transitionTo('clinic.doctor.index', doctor);
......这是行不通的,因为content.doctors.length仍然是0当这个代码运行app_router.js.
有任何想法吗?
Ember.Route.model有权访问params变量,但Ember.Route.setupController没有.这对我来说很麻烦,因为我的路径有多个动态段,我需要在我的模板中使用所有这些段.
具体来说,我的路径如下:/project/:project_id/task/:task_id.请注意,任务可以属于许多项目,而不仅仅是一个.因此,我们不能告诉我们正在查看的项目只是查看任务本身:我们必须使用URL中找到的项目ID.这是我目前正在做的事情:
App.TaskRoute = Ember.Route.extend({
  // This works just fine:
  serialize: function(model) {
    return {
      task_id: model.get('id'),
      project_id: this.modelFor('project').get('id')
    };
  },
  model: function(params) {
    this.set('parentProjectId', params.project_id);
    return App.Task.find(params.task_id);
  },
  setupController: function(controller, model) {
    var parentProject = this.modelFor('project') ?
                        this.modelFor('project') :
                        App.Project.find(this.get('parentProjectId'));
    controller.set('parentProject', parentProject);
    controller.set('content', model);
  }
});
也许我是偏执狂,这只是感觉hacky.如果路由是为了访问参数,那么它已经params附加了一个属性.有没有更好的办法?
编辑:我对上面的代码做了一些更新.此外,我的路线看起来像这样:
App.Router.map(function() {
  this.resource('project', { path: '/project/:project_id' });
  this.resource('task', { path: 'project/:project_id/task/:task_id' });
});
这是了解Ember路线的后续行动.
主/详细视图很棒,但我正在尝试使用分层URL路由而不嵌套模板.但是,对于像痕迹链接和其他引用这样的东西,我仍然需要访问父模型.
所以/users/1/posts应该显示用户1的帖子列表.并且/users/1/posts/1应该为用户1显示帖子1,但它不应该在user模板内部呈现{{outlet}}.相反,它应该完全取代user模板.但是,我仍然需要访问post模板中的当前用户,以便我可以链接回用户,显示用户的姓名等.
首先我尝试了这样的方法(方法#1):
App.Router.map(function() {
  this.resource('user', { path: '/users/:user_id' }, function() {
    this.resource('posts',  function() {
      this.resource('post', { path: '/:post_id' });
    });
  });
});
...
App.PostRoute = Ember.Route.extend({
  model: function(params) {
    return App.Post.find(params.post_id);
  },
  renderTemplate: function() {
    this.render('post', {
      into: 'application'
    });
  }
});
正如预期的那样,这将user模板替换为模板post.但是,当我单击浏览器的后退按钮时,user模板不会再次渲染.显然,后视图被销毁但父视图未被重新插入.这里有几个问题提到这一点.
然后我让它用这样的东西(方法#2):
App.Router.map(function() {
  this.resource('user', { path: '/users/:user_id' },  function() {
    this.resource('posts');
  this.resource('post', { path: '/users/:user_id/posts' …