当前位置: 首页 > 面试题库 >

在控制器之间传递数据

闻人宏盛
2023-03-14
问题内容

我打算学习来自许多不同的MV *框架的AngularJS。我喜欢框架,但是在控制器之间传递数据时遇到了麻烦。

假设我有一个带有一些输入(input.html)的屏幕和一个控制器,比方说InputCtrl。
此视图上有一个按钮,可将您带到另一个屏幕,例如,使用控制器ApproveCtrl批准(approve.html)。
此ApproveCtrl需要来自InputCtrl的数据。在较大的应用程序中,这似乎是非常普遍的情况。

在我以前的MV *框架中,这将像(伪代码)一样处理:

   var self = this;
   onClick = function() {
          var approveCtrl = DI.resolve(ApproveCtrl);
          approveCtrl.property1 = self.property1;
          approveCtrl.property1 = self.property2;
          self.router.show(approveCtrl);  
   }
  • 首先,它会像Controller一样工作。首先创建控制器,然后将其置于正确的状态。然后创建视图。

现在,在AngularJS中,我这样处理:

 var self = this;
 onClick = function(){
          self.$locationService.path('approve');       
 }
  • 这就像先查看。您说要导航到哪个视图/路线,则由框架创建Controller。

我发现很难控制创建的Controller的状态并将数据传递给它。我已经看到并尝试了以下方法,但是我认为所有方法都有其自身的问题:

  1. 将共享服务注入InputCtrl和ApproveCtrl,并将所有数据共享到该服务上
    • 这看起来像一个肮脏的解决方法;共享服务中的状态变为全局状态,而我只需要它即可将数据传递给ApproveCtrl
    • 此共享服务的生存期比我需要的更长-仅将数据传递给ApproveCtrl
  2. 在$ routeParams中传递数据
    • 当传递很多参数时,这变得非常混乱
  3. 使用$ scope事件
    • 从概念上讲,这不是我要用于事件的东西-我只需要将数据传递给ApproveCtrl,就没有事件了
    • 这很麻烦。我必须先向父母发送事件,然后再将事件广播给孩子

我在这里想念什么吗?我会创建太多小型控制器吗?我是否在这里过多地坚持其他框架的习惯?


问题答案:

就结构而言,AngularJS比MVC更模块化。

经典MVC描述了3个简单的层,它们相互交互,以便控制器将模型与View缝合在一起(模型不应该直接与View一起使用,反之亦然)。

在Angular中,您可以有多个完全可选的实体,它们可以通过多种方式相互交互,例如:

可能的相互作用

这就是为什么有多种方法在不同实体之间传递数据的原因。您可以:

  • 使用和之间的差异直接在控制器之间发送消息this``$scope
  • 使用事件发送消息
  • 使用共享系统发送消息(注意:与上面相同的链接,答案显示了两种方法)

要么

  • 使用AJAX后端发送消息
  • 使用外部系统(例如MQ)发送消息

…还有更多。由于其多样性,Angular允许开发人员/设计人员选择最适合自己的方式进行下去。我建议你阅读AngularJS开发指南,你可以找到
祝福 解决一些常见问题。



 类似资料:
  • 问题内容: 我是iOS和Objective-C以及整个MVC范例的新手,我坚持以下几点: 我有一个充当数据输入表单的视图,我想给用户选择多个产品的选项。产品在另一个视图上以列出,并且我启用了多个选择。 我的问题是,如何将数据从一个视图传输到另一个视图?我将把选择保留在一个数组中,但是如何将其传递回先前的数据输入表单视图,以便在提交表单时将其与其他数据一起保存到Core Data? 我到处冲浪,看到

  • 问题内容: 我有一个基本的控制器来显示我的产品, 在我看来,我正在列表中显示此产品 我要尝试做的是,当某人单击产品名称时,我有另一个名为cart的视图,其中添加了该产品。 因此,我的疑问是,如何将这种点击产品从第一个控制器传递给第二个?我认为购物车也应该是控制器。 我使用指令处理click事件。我也觉得我应该使用服务来实现上述功能,只是想不通如何?因为购物车将是预定义的,所以添加的产品数可能是5/

  • 问题内容: 当使用AngularJS服务尝试在两个控制器之间传递数据时,我的第二个控制器在尝试从该服务访问数据时始终会收到未定义的信息。我猜这是因为第一个服务执行的是$ window.location.href,并且我认为这正在清除服务中的数据?我是否可以将URL更改为新位置,并将数据保留在第二个控制器的服务中?当我运行下面的代码时,第二个控制器中的警报始终未定义。 app.js(定义服务的位置)

  • 我试图在不同FXML场景的控制器之间传递数据。但是我不能将数据传递给另一个控制器。这是我的第一个控制器。 } 这是第二个控制器。 }

  • 问题内容: 我想单击一列并将单元格索引发送到新阶段。但是我无法将参数()传递给另一个控制器。我已经尝试了所有方法,但仍然无法正常工作。 主控制器 EditClientController 问题答案: 如果要在FXML文件中指定控制器(因此您不能使用Deepak的答案), 并且 要访问方法中的索引(因此您不能使用José的答案),则可以使用控制器工厂:

  • 问题内容: 我正在尝试将应用程序从Objective-C转换为Swift,但是我找不到如何使用Swift在视图之间传递数据。我的Objective-C代码是 这样做是从根本上获取变量TheNum,并将其传递给另一个视图控制器上的变量num。我知道这可能是一个简单的问题,但是我对Swift感到非常困惑,因此,如果有人可以解释他们如何将其更改为Swift,将不胜感激! 谢谢 问题答案: 假设我们站在