Emberjs Dynamic Route URL取值
上週同事在試emberjs時發現extend原本的route然後去set model時會導致呼叫transitionToRoute失敗,造成URL會變成像http://x.x.x.x/post/undefine/edit 只能使用Model覆寫find method的方式去做。 今天晚上想說有空來試一下,結果一試之下用set model的方法也可以啊XD.
先在route map裡加上route setting,例如我想要的URL像http://x.x.x.x/post/{dynamic value}/edit
App.Router.map(function(match) { this.resource('post', { path: '/post/:post_id' }, function() { this.route('edit'); }); }
extend route然後更改model return的值, 傳入參數params裡可以取得你在url裡輸入的dynamic value
App.PostRoute = Ember.Route.extend({ setupController: function(controller, model) { controller.set('content', model); }, model : function(params){ var id = params.post_id; post = new App.Post; post.id = id; var reg = /^[0-9]*$/; if (reg.test(id)){ post.isNumber = true; post.sqrt = id * id; } return post; } });
別忘記定義你的Post model
App.Post = Ember.Object.extend({ id: 0, sqrt: 0, isNumber: false });
在Post controller加上一個function讓Post的template可以觸發導到sub route也就是{dynamic value}/edit
App.PostController = Ember.ObjectController.extend({ goEdit: function() { this.transitionToRoute('post.edit'); } });
最後只要在template裡面觸發goEdit function即可
Ember.TEMPLATES['post'] = Ember.Handlebars.compile( "\ <p>post id : { {id}} </p>\ <p>post isNumber : { {isNumber}} </p>\ { {#if isNumber}}\ <p>square of id is : { {sqrt}} </p>\ { {/if}}\ <a href='' { { action goEdit}}>GoEdit</a>\ " );
另一種方法就是不需要第2步,然後直接在第3步的model裡加上find function. 可以達成一樣的效果
App.Post = Ember.Object.extend({
id: 0,
sqrt: 0,
isNumber: false
});
App.Post.reopenClass({
find: function (id) {
var reg = /^[0-9]*$/;
post = new App.Post;
post.id = id;
if (reg.test(id)){
post.isNumber = true;
post.sqrt = id * id;
}
return post;
}
});