Ember.js新的路由器导航错误消息:错误:断言失败:无法在未定义的对象上使用'id'调用get

时间:2013-01-14 23:03:49

标签: ember.js ember-router

我一直在尝试新的路由器和新的Ember代码(版本:v1.0.0-pre.2-366-g4772b18),我有点麻烦。我想做一件简单的事情:当我点击一个链接时,它应该导航到那个状态。

但我得到了这个错误:

  

断言失败:无法在未定义的对象上使用'id'调用get。

要触发错误,请单击红色大标题。第一个位于顶部 - 即“Ember Ready”。

我没有JSFiddle,但您可以在此处查看实时网站:http://eduardmoldovan.com/我基本上已经在那里推送了相同的代码。

我的代码:

var Ngin = window.Ngin = Ember.Application.create({
    ready: function() {
        "use strict";
        this.set("Router.enableLogging", true);
        this.set("Router.location", "history");
    },
    customEvents: {
        blur: "blur",
        paste: "paste",
        changed: "changed"
    }
});

DS.RESTAdapter.configure("plurals", {
    article: "article"
});

Ngin.Store = DS.Store.extend({
    revision: 11,
    adapter: DS.RESTAdapter.create({
        namespace: "private-api",
        bulkCommit: true
    })
});

Ngin.Article = DS.Model.extend({
    title: DS.attr("string"),
    lead: DS.attr("string"),
    url: DS.attr("string"),
    pubdate: DS.attr("date"),
    channel: DS.attr("string")
});

Ngin.IndexController = Ember.ObjectController.extend({
    content: [],
    goToArticle: function() {
        "use strict";
        this.get('target').transitionTo("article");
    }
});
Ngin.IndexModel = DS.Model.extend({});

Ngin.ApplicationView = Ember.View.extend({
    templateName: "page"
});

Ngin.Router.map(function(match) {
    "use strict";
    match("/").to("index");
    match("/technical/:url/").to("article");
});

Ngin.IndexRoute = Ember.Route.extend({
    setupController: function(controller) {
        "use strict";
        var all,
            latestOne,
            latestList;
        latestOne = Ngin.Article.find({
            filter: 'latest-one'
        });
        latestList = Ngin.Article.find({
            filter: 'latest-list'
        });
        controller.set('latestOne', latestOne);
        controller.set('latestList', latestList);
    },
    renderTemplate: function() {
        "use strict";
        this.render("header", {
            outlet: "header"
        });
        this.render("index", {
            outlet: "content"
        });
        this.render("footer", {
            outlet: "footer"
        });
    }
});


Ngin.ArticleRoute = Ember.Route.extend({
    model: function(params) {
        "use strict";
        console.log('ede');
        return Ngin.Article.find(params.url);
    },
    setupController: function(controller) {
        "use strict";
    },
    renderTemplate: function() {
        "use strict";
    }
});

$("body div").remove();

Ngin.initialize();

这样的简单动作:{{action goToArticle}}

我真的不明白谁想叫什么。有什么想法吗?我一直在寻找答案或例子,但对此并不幸运。

1 个答案:

答案 0 :(得分:10)

您的问题是您在没有提供型号的情况下致电transitionTo

Ember正试图转换到article路线。为此,需要生成:url动态细分的值。为了实现这一点,它将您传递的模型作为第二个参数传递给路径的transitionTo方法{/ 1}}。

默认serialize方法尝试使用模型的serialize属性填充动态细分。

您的行动是:

id

应该是:

{{action goToArticle}}

然后,您需要更新{{action "goToArticle" article}} 以获取参数:

IndexController

所有这些都说,你真的应该在这里使用链接,而不是动作。那会为你处理一切:

Ngin.IndexController = Ember.ObjectController.extend({
  content: [],
    goToArticle: function(article) {
      this.transitionTo("article", article);
    }
});

您可以在Ember指南中了解the link helperthe action helper