从路径转换的灰烬可防止创建新记录

时间:2013-02-11 14:18:45

标签: ember.js

直接访问/documents/new/1可以正常工作,但是当来自/documents/select时,由于Ember之前在选择路线中所做的查询,该记录已经可用。

路线

this.resource('documents', function() {
  this.route('new', { path: '/new/:document_id' });
  this.route('show', { path: '/:document_id' });
  this.route('select');
});

路线

App.DocumentsSelectRoute = Ember.Route.extend({
  model: function() {
    return App.Document.find({public: true});
  }
});

App.DocumentsNewRoute = Ember.Route.extend({
    model: function (params) {
      console.log('New Model')
      var originalDoc = App.Document.find(params.document_id),
          newDoc = App.Document.createRecord();
          originalDoc.one('didLoad', function () {
               newDoc.setProperties(this.serialize());
          });
          return newDoc;
    }
});
来自Select路线的

model永远不会被调用,因为record已经加载到那里。我找到了一些有关此行为的信息,但它对我的情况https://stackoverflow.com/a/14591851/555240

没有帮助

更新:
模板

application.handlebars

<li>{{#linkTo "documents.select"}}New{{/linkTo}}</li>

select.handlebars

<ul>
{{#each doc in controller}}
  <li>
    {{#linkTo "documents.new" doc}}<div class="cover"></div>{{/linkTo}}
    {{#linkTo "documents.new" doc}}{{doc.title}}{{/linkTo}}
  </li>
{{/each}}
</ul>

new.handlebars

{{ model }}
{{#if model.slug }}
  {{ view App.DocumentView templateNameBinding="model.slug" class="document portrait" }}
{{ else }}
  Loading...
{{/if}}
转换到{{ model }}时{p> new.handlebars显示<App.Document:ember340:1>,但直接导航时显示<App.Document:ember304:null>

1 个答案:

答案 0 :(得分:1)

首先,在您的资源定义中,您有:

this.route('new', { path: '/new/:document_id' });

这意味着您在新文档的网址中有一个动态细分,因此Ember希望当您访问url / document / new / 1时,您将使用文档带有id 1.默认行为是检索id为1的 Document 并使其可用作模型。

通常使用RESTful结构,您将拥有一个静态网址,例如 / document / new ,它会创建一个新的文档而不是查找现有的

但是,如果您确定要使用代码DocumentsNewRoute.model函数,那么我建议您更改select.handlebars文件中的链接。

在您的select.handlebars文件中,您有:

{{#linkTo "documents.new" doc}}

这意味着它将传递 doc 对象作为DocumentsNewRoute路由的上下文。如果您将其更改为:

{{#linkTo "documents.new"}}

然后它将没有上下文,因此它将在 DocumentsNewRoute 路由上执行模型功能。但是,在参数中找不到模型就没有id。因此,您可以更改代码以创建新记录

ps:您确定需要从数据库中为此路线检索文档吗?