Ember.js 仅在页面刷新时加载路由-Ember JS

Ember.js 仅在页面刷新时加载路由-Ember JS,ember.js,Ember.js,我目前正在学习余烬,我正在制作一个简单的应用程序,但我遇到了一个奇怪的问题。我有一个路由设置,它只拉数据时,我重新加载页面。这是我的密码: // Start Ember application App = Ember.Application.create({ LOG_TRANSITIONS: true }); // Router paths App.Router.map(function () { // Homepage this.resource('index',

我目前正在学习余烬,我正在制作一个简单的应用程序,但我遇到了一个奇怪的问题。我有一个路由设置,它只拉数据时,我重新加载页面。这是我的密码:

// Start Ember application
App = Ember.Application.create({
    LOG_TRANSITIONS: true
});

// Router paths
App.Router.map(function () {

    // Homepage
    this.resource('index', { path: '/' });

    // Book view
    this.resource('book', { path: '/book/:id/:version' });

});

// Homepage route
App.IndexRoute = Ember.Route.extend({
    model: function () {
        // Get all the books
        return Ember.$.getJSON('/books');
    }
});


// Single book view
App.BookRoute = Ember.Route.extend({
    model: function (params) {
        // Get a single book
        return Ember.$.getJSON('/book?id=' + params.id + '&version=' + params.version);
    }
});
当我从主页点击进入/#/book/1/1时,页面是空白的。当我在页面上刷新页面时,它会加载数据,一切正常


为什么会这样?当用户从主页单击时,我能做些什么使其工作?

您应该在链接中传递一个模型。粘贴模板代码以检查如何创建链接。检查此项以了解更多信息

指向帮助程序的余烬
链接不会执行
模型
回调。我最近处理了一个非常类似的情况,下面是我如何解决它的:

// In the index template
{{#each book in model}}
  {{#link-to 'book' book}}{{book.name}}{{/link-to}}
{{/each}}
当你点击链接时,你会得到一个像现在一样的空白页面,因为
BookRoute
model回调没有被触发。但是,
BookController#init
功能将被触发。你可以用这个去抓取关于这本书的其他细节

App.BookController = Ember.Controller.extend({
  init: function() {
    this._super();

    // Replace doesNotHaveAllInfo with your check
    if (doesNotHaveAllInfo) {
      this.set('model', Ember.$.getJSON('/book?id=' + this.get('model.id') + '&version=' +  this.get('model.version')));
    }
  },
});
这样,如果通过
链接加载到
,将获取新的详细信息。请注意,这将要求
索引
路线上加载的书籍至少包含
id
版本

或者,如果刷新页面,将出现
model
回调,并且
doesNotHaveAllInfo
检查将返回false。无论您是单击链接到
还是刷新页面,您都会看到您的数据

我还建议将
Ember.$.getJSON
代码抽象为可重用的方法,可能是在模型上,如下所示:

App.Book.reopenClass({
  find: function(id, version) {
    return Ember.$.getJSON('/book?id=' + id + '&version=' +  version);
  }
});

然后,您可以使用
App.Book.find()
返回路线和
BookController中的模型

谢谢大家的建议。我用下面的代码计算出来:

App.BookRoute = Ember.Route.extend({
    setupController: function (controller,model) {
        // Get a single book
        Ember.$.getJSON('/book?id=' + model.id + '&version=' + model.version,
            function (data) {
                controller.set('model',data);
            });
    }
});

我使用了setupController而不是model。

如果使用“链接到帮助器”,则不能在此设置上下文模型。。。你只需要设置一个id

{{#each book in books}}
  {{#link-to "book" book.id}}{{book.name}}{{/link-to}}
{{/each}}

下一个路径的模型将是request。

如果您已经拥有索引路径中的所有书籍,为什么要对BookRoute中的每一本书进行请求?。顺便说一句,看看这里。有一个文本:注意:带有动态段的路由只有在通过URL输入时才会调用其模型挂钩。如果路线是通过转换输入的(例如,使用“链接到把手”辅助对象时),则已提供模型上下文,并且不会执行挂钩。没有动态段的路由将始终执行模型挂钩。我不知道这是否是您的情况,您是否使用链接来转换到该书?如果是这样,这就是为什么页面是空的,模型钩子id没有执行,因为您已经拥有了模型。当你刷新页面时,它会被执行,因为在这种情况下,你直接在url中输入。我使用的是link-to。如果我在主页上加载这本书的所有细节,JSON会非常大。主页只是一个书籍列表,当用户单击其中一本时,我想加载该书的具体细节。不幸的是,文档中是这么说的,如果您将其与链接一起使用,则不会执行模型挂钩。让我们看看别人是怎么做的,我明白。我需要正确地执行此操作。当您说“用您的支票替换doesNotHaveAllInfo”时,我正在检查什么?您将检查您的模型,以查看它是否具有您希望在此页面上显示的额外详细信息。例如:
if(this.get('model.details')==未定义)