【问题标题】:Ember JS how to set up ApplicationEmber JS 如何设置应用程序
【发布时间】:2012-11-15 23:45:53
【问题描述】:

我是 Ember 菜鸟,正在努力让它发挥作用;但是我对 App.initialize() 方法感到困惑。

如果我使用以下代码,它会抛出错误(找不到对象 App):

App = Ember.Application.extend()
App.initialize()

但是,如果我使用以下代码;它说初始化被调用了两次。

App = Ember.Application.create()
App.initialize()

最好的方法是什么?

【问题讨论】:

    标签: javascript model-view-controller ember.js


    【解决方案1】:

    Ember “create” 方法不接受任何参数,或者接受一个包含用于初始化新实例化对象的值的对象,因此您也可以像下面这样:

     var appConfig = {
            Token: token;
        };
    
     App = Ember.Application.create(appConfig);
    

    【讨论】:

      【解决方案2】:

      Application 不再提供initialize 方法。相反,您应该使用 Application#deferReadinessApplication#advanceReadiness 组合。

      从 Ember 源代码中提取的示例:

      App = Em.Application.create();
      App.deferReadiness();
      
      jQuery.getJSON("/auth-token", function(token) {
        App.token = token;
        App.advanceReadiness();
      });
      

      另外,查看jsfiddle中的示例:

      window.App = Em.Application.create();
      
      App.deferReadiness();
      
      window.setTimeout(function() {
        Em.TEMPLATES["application"] = Em.Handlebars.compile('<h1>App</h1> this is a template');
        App.advanceReadiness();
      }, 1500);
      

      【讨论】:

      • 这个答案使返回值成为一个全局变量(App.token)。您如何将值放入控制器中?在最新的 Ember 中似乎没有简单的方法可以从应用程序中访问给定的控制器。
      • @KevinPauli 如果token 在控制器中,我们可以使用needs(来自另一个控制器)或controllerFor(来自路由)
      • 但是在上面的 jQuery 回调中,我们不在控制器或路由中,这让我可以通过“this”访问它。在这种情况下,我们处于全局 Javascript 空间。我看到的每个延迟/提前准备的例子似乎都遵循这种模式,并将 AJAX 结果作为全局直接粘贴到 App 中。我继续问这个问题:stackoverflow.com/questions/16205615/…
      【解决方案3】:

      只需创建您的应用程序并让 Ember 对其进行初始化。

      您需要做的就是:

      App = Ember.Application.create()
      

      应用程序将不会立即初始化。它至少会等待 DOM 准备就绪并等待定义其余类(通过等待控制权从当前执行的 JavaScript 返回给浏览器)。

      如果您想因其他原因推迟,请执行以下操作:

      App.deferReadiness();
      $.getJSON("/boot", function() { App.advanceReadiness(); });
      

      这将等待启动应用程序,直到 /boot Ajax 调用返回。

      【讨论】:

      • 如何将AJAX调用的返回值放入控制器,而不是App中的全局变量中?我试图避免全局变量。 jquery 调用发生在任何 Ember 对象之外,并且全局“App”命名空间没有提供获取我可以看到的单个控制器的方法...
      【解决方案4】:

      首先,您必须了解 create() 和 extend() 之间的区别。简单的理解方法是 extend() 方法只是扩展了 Ember.Application 的类,而 create() 方法创建了 Ember.Application() 的实例。在创建实例时,它运行构造函数。有 3 种方法可以创建 Ember.App 并运行它。

      1

      var App= Ember.Application.extend()
      App.initialize()
      

      2.

      var App = Ember.Application.create()
      

      这会在你创建对象后立即初始化。

      3

      var App= Ember.Application.extend()
      App.create()
      

      要更多地了解 Ember 对象,请通过此链接。 Understanding Ember.Object

      【讨论】:

        【解决方案5】:

        看看这里是怎么做的:

        http://emberjs.com/documentation/#toc_creating-a-namespace

        如何引导:

        window.App = Ember.Application.create();
        

        如果没有使用过 ember.js,我建议 create 和 initialize 都进行初始化,这就是为什么你得到后一个错误告诉你它被初始化了两次。

        您的第一个版本是尝试扩展 Application 对象,即您创建新功能。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-12-22
          • 1970-01-01
          • 1970-01-01
          • 2015-10-31
          • 1970-01-01
          • 2021-07-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多