Ember.js 查询服务器上的绑定/观察数据
我很抱歉,如果这有一个痛苦的明显的答案,但我既是一个JS和烬noob,我有困难找到一个解决方案,我认为是一个常见的情况。本质上,我有一个多页面的应用程序,前端是html/css/js,后端是java,有一个公开的RESTAPI。我有一个app.js文件,包含在所有屏幕和多个控制器中,其中一些仅适用于单个屏幕 编辑:忘记我的问题了。我的问题是如何延迟对服务器的用户数据查询,直到我的控制器有一个观察者为止。由于控制器出现在多个屏幕上(并非所有屏幕都需要它),我不想盲目地查询对象的创建,因为这将是浪费。现在,我有一种很老练的方法,在页面内联脚本标记的末尾,我调用了populate方法。下面是我的代码当前的样子 app.js部分:Ember.js 查询服务器上的绑定/观察数据,ember.js,Ember.js,我很抱歉,如果这有一个痛苦的明显的答案,但我既是一个JS和烬noob,我有困难找到一个解决方案,我认为是一个常见的情况。本质上,我有一个多页面的应用程序,前端是html/css/js,后端是java,有一个公开的RESTAPI。我有一个app.js文件,包含在所有屏幕和多个控制器中,其中一些仅适用于单个屏幕 编辑:忘记我的问题了。我的问题是如何延迟对服务器的用户数据查询,直到我的控制器有一个观察者为止。由于控制器出现在多个屏幕上(并非所有屏幕都需要它),我不想盲目地查询对象的创建,因为这将是浪费
App = Ember.Application.create();
User = Ember.Object.extend({
username: 'empty',
fullname: 'empty user'
});
App.UserDataSource = Ember.Object.extend({
fetchMyUser: function(callback) {
$.get('ncaa/user', function(data) {
callback(User.create({
username: data.username,
fullname: data.fullname}));
});
}
});
App.userDataSource = App.UserDataSource.create();
App.UserController = Ember.Object.extend({
content: null,
populate: function() {
var controller = this;
this.get('dataSource').fetchMyUser(function(data) {
controller.set('content', data);
});
}
});
App.userController = App.UserController.create({
dataSourceBinding: Ember.Binding.oneWay('App.userDataSource')
});
Ember.run.sync();
index.html的部分
<script type="text/x-handlebars">
Welcome, {{App.userController.content.fullname}}
</script>
....other code....
<script type="text/javascript">
$(document).ready(function() {
....other code....
App.userController.populate();
});
</script>
欢迎,{App.userController.content.fullname}
……其他代码。。。。
$(文档).ready(函数(){
……其他代码。。。。
App.userController.populate();
});
我确信我的第一步将是修改车把模板以扩展Ember.View,但我想知道社区认为什么是最佳实践。另外,我尝试将所有这些都放在一个app.js文件中是错误的吗?如果只在需要用户显示的屏幕上导入控制器,则可以查询控制器的创建情况。我的问题的答案最终出现在Ember.View中。基本上,我所做的是重写视图的init函数,该函数添加调用以使用数据填充必要的控制器。该视图是通过Handlebar模板实例化的,因此不再需要不必要的调用或黑客操作。下面是一些重要的变化 Index.html:
<script type="text/x-handlebars">
{{#view App.UserNameView }}
Welcome, {{fullName}}
{{/view}}
</script>
App.UserNameView = Em.View.extend({
init: function() {
this._super();
App.userController.populate();
},
fullNameBinding: 'App.userController.content.fullname',
userNameBinding: 'App.userController.content.username'
});