Ember.js でデータ駆動型のメニュー システムをまとめようとしています。JavaScript は次のjs/nodal.js
とおりです。
window.Form = Ember.Application.create();
var menuOptions = [
{id: "root",
options: [ "a", "b" ]},
{id: "a",
name: "Option A",
options: [ "c", "d" ]},
{id: "b",
name: "Option B",
options: [ "e", "f" ]},
{id: "c",
name: "Option C"},
{id: "d",
name: "Option D"},
{id: "e",
name: "Option E"},
{id: "f",
name: "Option F"}
]
Form.MenuOption = Ember.Object.extend({});
var builtOptions = menuOptions.map( function(attrs) {
return Form.MenuOption.create( attrs );
});
Form.options = {};
for( i = 0; i < builtOptions.length; i++ ) {
var opt = builtOptions[i];
Form.options[opt.id] = opt;
}
Form.MenuRoute = Ember.Route.extend({
model: function(params){
console.log( params );
if( !params || !params.index_id || params.index_id == "undefined") {
params.index_id = "root";
}
var keys = Form.options[params.index_id].options;
var options = new Array();
keys.map(function(k){ options.push( Form.options[k] ); });
return options;
}
});
Form.IndexRoute = Ember.Route.extend({
redirect: function(){
/* This here is the problem line... */
this.transitionTo( "menu", Form.options.root );
}
});
Form.Router.map(function(){
this.resource( "menu", { path: "/menu/:index_id" } );
});
HTML は次のようになります。
<title>Hello</title>
<meta name="description" content="My First Ember.js App">
<meta name="author" content="Your Name Here">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<script data-template-name="application" type="text/x-handlebars">
<h1>Title Goes Here</h1>
{{outlet}}
</script>
<script data-template-name="menu" type="text/x-handlebars">
<ul>
{{#each controller}}
<li>{{#linkTo menu this}}{{name}}{{/linkTo}}</li>
{{/each}}
</ul>
</script>
<script src="js/libs/jquery-1.9.1.js"></script>
<script src="js/libs/handlebars.js"></script>
<script src="js/libs/ember-1.0.0-rc.1.js"></script>
<script src="js/nodal.js"></script>
</body>
</html>
私が望むのは、ユーザーが/menu/root
ページを開くとすぐにリダイレクトされることです。これまでのところ、これを機能させるための適切な呪文を見つけることができませんでした. 上記をロードすると、次の例外が発生します。
Error: assertion failed: an Ember.CollectionView's content must implement Ember.Array. You passed <(generated menu controller):ember172>
直接ロードindex.html#/menu/root
すると機能します-機能していないのはリダイレクトだけです。this.transitionTo
IndexRoute 定義の行を次のように置き換えます。
this.transitionTo( "menu", [Form.options.root] );
は/menu/undefined
リダイレクトしますが、 ではなくにリダイレクトし/menu/root
ます。それは醜く、明らかに壊れています。
私は何を逃したのですか?
編集
提案どおり、ArrayController を追加してみました。
Form.MenuController = Ember.ArrayController.extend({});
これにより、新しいエラーが発生します。
arrangedContent.addArrayObserver is not a function