要想用这个用户列表的例子来充分展示
ember.js
,我们需要能够创建新的用户,否则用户列表功能就没有任何实际的应用价值了。创建新的用户其实并不需要users/:user_id/edit
建立一个新的路由,只是要创建一个对象就可以达到目的。
在列表中添加对象
1、添加一个createUser
“创建用户”按钮
<li><a href="#" {{action createUser}}>+ New User</a></li>
2、添加处理程序语句
现在我们将一个处理程序 events 添加到应用程序的路由,然后转向用户编辑页面:
App.ApplicationRoute = Ember.Route.extend({
model: function() {
return users;
},
events: {
createUser: function() {
var users = this.modelFor('application'); // 定义数据来源于 application 数据模型
var user = users.pushObject({id: users.length}); //创建一个新用户
this.transitionTo('editUser', user); // 转向 editUser 页面
}
}
});
你可能会想到pushobject
不是一个JavaScript的数组方法啊?当你为路由的 model 钩子提供了一个模型的时候,Ember 会把原始数组(users)转换为 ember array(ember扩展数组),(和原始数组相比)ember array 提供了 observation 以及诸如 pushObject 这样的便利方法。也就是说,Ember 把JavaScript的原生数组 扩展为ember 数组,保持了原有数组特性和方法同时,也扩展一些新的方法便于web开发和应用,这些方法之一就是 pushObject 方法。
看不懂的话参照,nightire的文章,这里特别感谢!
完整代码:
<!DOCTYPE html>
<html>
<head>
<meta name="description" content="Ember: Routes, {{outlet}}, and {{#linkTo}}" />
<script src="http://code.jquery.com/jquery-1.9.1.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/handlebars.js/1.0.0-rc.3/handlebars.js"></script>
<script src="http://ember101.com/jsbin/ember.rc3.js"></script>
<meta charset=utf-8 />
<!--
Created using JS Bin
http://jsbin.com
Copyright (c) 2016 by symphonyh (http://jsbin.com/dataro/1/edit)
Released under the MIT license: http://jsbin.mit-license.org
-->
<meta name="robots" content="noindex">
<link href="//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.1/css/bootstrap-combined.min.css" rel="stylesheet">
<title>Episode 5</title>
<style id="jsbin-css">
body { margin-top: 30px }
.active {
color: red !important;
}
</style>
</head>
<body>
<script type="text/x-handlebars">
<div class="container">
<div class="row-fluid">
<ul class="nav nav-list span3 well">
<li><a href="#" {{action createUser}}>+ New User</a></li>
{{#each model}}
<li>{{#linkTo "user" this}}{{first}}{{/linkTo}}</li>
{{/each}}
</ul>
<div class="span9 well">{{outlet}}</div>
</div>
</div>
</script>
<script type="text/x-handlebars" id="user">
<h2>
{{first}} {{last}}
<img {{bindAttr src="avatar"}} class="pull-right" width=50 />
</h2>
<dl>
<dt>First</dt>
<dd>{{first}}</dd>
<dt>Last</dt>
<dd>{{last}}</dd>
</dl>
{{#linkTo "editUser" this class="btn btn-primary"}}Edit{{/linkTo}}
</script>
<script type="text/x-handlebars" id="editUser">
<h2>Edit User</h2>
<form class="form-inline" {{action save on="submit"}}>
<label>
First:
{{input type="text" value=first}}
</label><br>
<label>
Last:
{{input type="text" value=last}}
</label>
<div class="controls">
<button type="submit" class="btn btn-primary">Done</button>
</div>
</form>
</script>
<script>
var App = Ember.Application.create();
App.Router.map(function() {
this.resource('user', {path: '/users/:user_id'});
this.resource('editUser', {path: '/users/:user_id/edit'});
});
App.ApplicationRoute = Ember.Route.extend({
model: function() {
return users;
},
events: {
createUser: function() {
var users = this.modelFor('application');
var user = users.pushObject({
id: users.length
});
this.transitionTo('editUser', user);
}
}
});
App.UserRoute = Ember.Route.extend({
model: function(params) {
return users[params.user_id];
}
});
App.EditUserRoute = Ember.Route.extend({
model: function(params) {
return users[params.user_id];
},
events: {
save: function() {
var user = this.modelFor('editUser');
this.transitionTo('user', user);
}
}
});
var users = [
{
id: 0,
first: 'Ryan',
last: 'Florence',
avatar: 'https://si0.twimg.com/profile_images/3123276865/5c069e64eb7f8e971d36a4540ed7cab2.jpeg'
},
{
id: 1,
first: 'Tom',
last: 'Dale',
avatar: 'https://si0.twimg.com/profile_images/1317834118/avatar.png'
},
{
id: 2,
first: 'Yehuda',
last: 'Katz',
avatar: 'https://si0.twimg.com/profile_images/3250074047/46d910af94e25187832cb4a3bc84b2b5.jpeg'
}
];
</script>
</body>
</html>