4

私は新しいルーターと新しい 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}}

誰が何を呼びたいのかよくわかりません。これについて何か考えはありますか?私は答えや例を探していましたが、幸運ではありませんでした。

4

1 に答える 1

10

あなたの問題はtransitionTo、モデルを提供せずに呼び出していることです。

articleEmber はルートに移行しようとしています。:urlそのためには、動的セグメントの価値を生成する必要があります。transitionToそれを取得するために、ルートのserializeメソッドに 2 番目のパラメーターとして渡すモデルを渡します。

デフォルトのserialize方法では、動的セグメントにidモデルのプロパティを入力しようとします。

あなたの行動は:

{{action goToArticle}}

そのはず:

{{action "goToArticle" article}}

IndexController次に、パラメーターを取得するように更新する必要があります。

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

とはいえ、ここではアクションではなくリンクを使用する必要があります。それはあなたのためにすべてを処理します:

{{#linkTo "article" article}}{{article.title}}{{/linkTo}}

リンク ヘルパーアクション ヘルパーについては、Ember ガイドで学習できます。

于 2013-01-14T23:59:25.960 に答える