Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ember.js 查询服务器上的绑定/观察数据_Ember.js - Fatal编程技术网

Ember.js 查询服务器上的绑定/观察数据

Ember.js 查询服务器上的绑定/观察数据,ember.js,Ember.js,我很抱歉,如果这有一个痛苦的明显的答案,但我既是一个JS和烬noob,我有困难找到一个解决方案,我认为是一个常见的情况。本质上,我有一个多页面的应用程序,前端是html/css/js,后端是java,有一个公开的RESTAPI。我有一个app.js文件,包含在所有屏幕和多个控制器中,其中一些仅适用于单个屏幕 编辑:忘记我的问题了。我的问题是如何延迟对服务器的用户数据查询,直到我的控制器有一个观察者为止。由于控制器出现在多个屏幕上(并非所有屏幕都需要它),我不想盲目地查询对象的创建,因为这将是浪费

我很抱歉,如果这有一个痛苦的明显的答案,但我既是一个JS和烬noob,我有困难找到一个解决方案,我认为是一个常见的情况。本质上,我有一个多页面的应用程序,前端是html/css/js,后端是java,有一个公开的RESTAPI。我有一个app.js文件,包含在所有屏幕和多个控制器中,其中一些仅适用于单个屏幕

编辑:忘记我的问题了。我的问题是如何延迟对服务器的用户数据查询,直到我的控制器有一个观察者为止。由于控制器出现在多个屏幕上(并非所有屏幕都需要它),我不想盲目地查询对象的创建,因为这将是浪费。现在,我有一种很老练的方法,在页面内联脚本标记的末尾,我调用了populate方法。下面是我的代码当前的样子

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'
});