Ember 在视图之间使用 [needs]

Posted

技术标签:

【中文标题】Ember 在视图之间使用 [needs]【英文标题】:Ember using [needs] in between views 【发布时间】:2014-03-04 14:35:40 【问题描述】:

我想知道 emberViews 之间是否可以交互??

使用控制器,我进行了类似这样的设置。

>> Index Controller
    var StudyController = Ember.ArrayController.extend(
      needs: ['study/study'],
      actions: 
        filterStudies: function()
          console.log('FILTER ENGAGED!');
          this.transitionToRoute('study.search', this.get('search'));
        
      
    );

在 StudyIndex HBS 中我使用了这个,现在在需要标签之间的控制器中处理

action 'deleteStudy' this target='controller.controllers.study/study'

【问题讨论】:

【参考方案1】:

这在视图之间是不可能直接实现的。 您应该在控制器的帮助下实现间接通信。考虑以下两个视图及其关联控制器的虚构示例:

您应该从 FirstView 向 FirstController(需要 SecondController)发送一个操作。然后控制器将操作转发给 SecondController。 SecondController 做它需要做的任何事情(例如,设置一个属性),从而通知 SecondView。

更新:示例

请注意:我假设您需要将对象从FirstView 发送到SecondView。如果您的事件不需要参数,则可以省略它。

查看:

App.FirstView = Ember.View.extend(
    submit : function()
            //do the view part of your logic
        var object = //do whatever you may need
        this.get("controller").send("actionInController", object); //you do not have to send a object, if you do not need to
    
);

控制器:

App.FirstController = Em.ObjectController.extend(
    needs : ['second'],
    actions : 
        submitInController: function(object) 
          // do the controller part of your logic
          this.get("controllers.second").methodOfSecond(object);
        
    ,
);  

App.SecondController = Em.ObjectController.extend(
    someProperty : null,
    methodOfSecond: function(object) 
        // set whatever property so that the second view gets informed
        this.set("someProperty", object);
    
);

【讨论】:

lmao,不错。打算试试这个。 如何在控制器之间使用“发送”。例如,在视图中我转到“this.get('controller') .. 现在我在控制器中,但是我如何在控制器中获取其他控制器。? 我添加了一个示例,展示了如何实现它。【参考方案2】:

Ember 视图之间的交互当然是可能的,但这取决于您所说的“交互”是什么意思。如果您的意思是在其他视图中访问属性、操作和函数,那么这可以通过几种不同的方式轻松完成。

首先,您可以从另一个视图扩展一个视图:

App.BaseView = Em.View.extend(
    // View logic here
);

App.OtherView = App.BaseView.extend(
    // Other view logic here
);

其次,您可以使用 mixin 来做到这一点。例如:

App.BaseStuff = Em.Mixin.create(
    // Functions and other logic here
);

App.OtherView = Em.View.extend(
    App.BaseStuff,  // Add mixin here
    // View logic here
);

但是,如果您询问一个视图是否可以访问另一个视图可用的内容或模型,那么如果没有进一步的工作,这是不可能的。例如,在控制器中使用需求属性或访问当前路由中的数据等。

【讨论】:

以上是关于Ember 在视图之间使用 [needs]的主要内容,如果未能解决你的问题,请参考以下文章

Ember.js 中的视图与组件

Ember.JS - 如何在同一页面中使用多个模型、控制器和视图?

在 ember 中,如何将视图数据从拖放中传递?

ember.js 从另一个视图更改视图

使用 Ember.js,如何在渲染视图后运行一些 JS?

Ember.js 的视图层