1

如果这有一个令人痛苦的明显答案,我深表歉意,但我既是 JS 又是 Ember 菜鸟,我无法找到解决我认为常见情况的解决方案。本质上,我有一个带有 html/css/js 前端的多页应用程序和一个带有暴露 REST api 的 java 后端。我有 1 个 app.js 文件,我包含在所有屏幕和多个控制器中,其中一些仅适用于单个屏幕。

编辑:忘了我的问题。我的问题是如何延迟对我的服务器的用户数据查询,直到我的控制器有观察者。由于控制器存在于多个屏幕上(并不都需要它),我不想盲目地查询对象的创建,因为这会很浪费。现在我有一个hacky方法,在页面的内联脚本标签的末尾我调用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>

我很确定我的第一步将是修改车把模板以扩展 Ember.View,但我想知道社区认为什么是最佳实践。另外,我尝试将所有这些都放在一个 app.js 文件中是错误的吗?如果仅在需要用户显示的屏幕上导入它,则可以查询我的控制器的创建。

4

1 回答 1

0

我的问题的答案最终出现在 Ember.View 中。本质上,我所做的是覆盖我的视图的 init 函数,它添加了调用以用数据填充必要的控制器。该视图是通过车把模板实例化的,因此不再有不必​​要的调用或变通的工作。下面的重要变化。

索引.html:

<script type="text/x-handlebars">
    {{#view App.UserNameView }} 
        Welcome, {{fullName}}
    {{/view}}
</script>

应用程序.js:

App.UserNameView = Em.View.extend({
    init: function() {
          this._super();
          App.userController.populate();
    },
    fullNameBinding: 'App.userController.content.fullname',
    userNameBinding: 'App.userController.content.username'
});
于 2012-05-14T15:17:01.793 回答