【问题标题】:From Rails & Backbone to ember从 Rails & Backbone 到 ember
【发布时间】:2013-02-16 16:42:49
【问题描述】:

我正在个人项目中试用 ember js。我正在努力理解 Ember 的不同组成部分是哪一部分。

我对 Rails 相当熟悉,并且在一定程度上使用过主干(从未使用过所有与路由相关的东西),并了解它们两者是如何工作的,以及什么样的对象扮演了 MVC 的哪个部分。

有了 Ember,事情就不是那么清楚了,看起来也不太容易。我已经阅读了指南和一些帖子,但我仍然在努力前进。我得到了模型部分,它与它的导轨和骨干对应物非常相似。我也有模板、车把之类的东西。路由器类似于rails路由器。

然后是控制器、路由和视图。据我了解,视图代表 ui 的一部分,并处理用户交互。我不太了解的是控制器/路由角色。

更具体地说:我希望我的应用程序有一个导航栏(带有指向页面部分的链接)和一个“用户连接小部件”,如果他已连接,则显示用户数据,如果没有,请允许他这样做,登录通过脸书等。

导航栏似乎适合视图,但是我需要将状态保留在某处(以突出显示当前页面),这似乎是控制器角色。并且用户小部件似乎适合控制器,但每个路由只有一个控制器,那么如何做到这一点?

非常感谢您的宝贵时间,我希望我已经足够清楚了!

:)

【问题讨论】:

    标签: javascript ember.js client-side


    【解决方案1】:

    控制器存储应用程序的状态。路由器管理应用程序的不同状态。没错,每条路由只有一个控制器,但你也可以访问其他控制器。

    假设这是您的 html:

    <script type="text/x-handlebars" data-template-name="application">
      <div class="main-content">
        {{outlet}}
      </div>
    </script>
    
    <script type="text/x-handlebars" data-template-name="index">
      <div class="nav-bar">
        <div class="user">
          {{#if isLoggedIn}}
            <div class="user-name">{{userName}}</div>
            {{else}}
            <button {{action "login" target="App.UserController"}}>
                Login
            </button>
            {{/if}}
        </div>
      </div>
      <div class="content">some other amazing content here</div>
    </script>
    

    和 JS:

    var App = Ember.Application.create({
      LOG_TRANSITIONS: true,
      rootElement: '#ember-app'
    });
    
    App.Router.map(function () {
      this.route('user');
    });
    
    App.IndexRoute = Ember.Route.extend({
      setupController: function(controller, model) {
        this.controller.set('isLoggedIn', this.controllerFor('user').get('isLoggedIn'));
      }
    });
    
    App.UserController = Ember.ObjectController.extend({
      isLoggedIn: false,
      userName: 'emberjs',
      login: function () {
         this.set('isLoggedIn', true);
      }
    });
    
    App.NavbarView = Ember.View.create({
      loggedInBinding: Ember.Binding.oneWay('App.UserController.isLoggedIn')
    });
    

    如果你需要从你的路由访问另一个控制器,你可以这样做:

    App.IndexRoute = Ember.Route.extend(function () {
      setupController: function () {
        var userController = this.controllerFor('user');
        console.log('this is a user controller instance', userController);
      }
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-08
      • 2017-06-14
      • 2012-06-16
      • 1970-01-01
      • 1970-01-01
      • 2012-11-29
      • 1970-01-01
      相关资源
      最近更新 更多