在Ember.js中,当您手动声明视图及其相应的控制器时,是否存在将其范围限定为当前应用程序状态的概念?

时间:2012-11-28 03:32:38

标签: javascript web-applications ember.js

作为示例,一个特定的应用程序状态可能具有仅呈现一些背景容器的主视图

App.EditView = Ember.View.extend({
      templateName:  'edit-template',
 })


App.EditController = Ember.ObjectController.extend({
      title: 'Edit state',
})

当我导航到这种状态时会实例化:

App.editRouter = Ember.Route.extend({

    route: '/edit',

    connectOutlets: function( router, context ){           
        router.get('applicationController').connectOutlet( 'mainOutlet', 'edit' )
    }
})

一旦到了这里,用户可以手动声明映射到新视图和控制器的新div元素(和模型但这里没有超级相关),新div可能是也可能不是editView呈现的div的子节点。

我正在做的当前方式

App.smallView1 = App.SmallView.create({ 
     controller: App.smallController1
}).append()

App.smallController1 = App.SmallController.create()

如您所见,此处没有任何内容表明视图和控制器声明了什么状态。 我很困惑:

此视图控制器对与EditView和EditController实例之间的关系是什么?

该对与editRouter之间有什么关系?

是否存在需要明确指定的依赖性?

1 个答案:

答案 0 :(得分:1)

路由器似乎没有使用此视图 - 控制器对,因此您必须为它们创建路由并将插座与视图 - 控制器对连接,除非您要将此视图附加到每个路线不会改变的元素。它也与其他视图 - 控制器对没有任何关系。

关于你的问题:

  

这个视图 - 控制器对和之间的关系是什么   EditView和EditController的实例?

答:现在的代码在小视图和控制器与编辑视图和控制器之间没有直接关系,但区别在于EditViewEditController对不是“创建的” “,但”给予“应用程序”,它将在需要时通过其自己的初始化逻辑(initialize)或在需要时创建视图实例时负责实例化该类型。 smallView1smallController1对可能不适合路由器,因为它们的实例名称以“1”结尾,我不确定Ember是否期望,但无论如何,这些都是实例化的并且直接作为“活动”对象附加到应用程序,使用路由器时不需要。这是否回答了你的问题?

  

该对与editRouter之间有什么关系?

答:在您的代码中,editRouter是您在该路线上时应用程序的状态(自Route扩展State以来)的定义;这意味着框架理解当你处于给定状态时,你需要发生一些特定的事情,例如,加载状态所需的视图,加载视图应该显示的数据等等......这是通过{{ 1}},因此对于此特定路线,您与connectOutletsmallView1没有任何关系,除非您使用smallController1的其他签名来指定connectOutlet和/ viewClass手动。

  

是否存在需要明确指定的依赖性?

答:是的。使用controller时,您的应用程序必须具有名为Router的控制器,并且当您调用ApplicationController时,您传递的名称必须对应于一个视图和控制器(我认为控制器可能不是我要求的,但我现在不确定)。因此,如果您说connectOutlet,框架将根据约定查找名为connectOutlet('about')的视图,然后将实例化此视图并在容器视图中的相应插座上进行渲染。

  

如果需要,控制器将如何访问路由器?

答:在您的应用程序中的任何一点,您都可以使用AboutView访问路由器,假设您的应用程序名为“App”,并且您的路由器名为“Router”,因此您的控制器中的任何方法都可以例如,使用路由器转换:App.router