【问题标题】:Angularjs share methods between controllerAngularjs在控制器之间共享方法
【发布时间】:2013-07-03 16:20:49
【问题描述】:

我有一个应用程序,它在一个页面(主页)上显示新闻提要,而在另一个页面上,它只为用户显示提要(用户个人资料页面)。

两个页面的外观和行为方式相同。内容的变化是由于调用了不同的URL。

如何在 angularjs 中解决这个问题?

我有一个家庭控制器,它具有用于显示主页的所有方法/逻辑。

现在我需要一个控制器来调用另一个 URL 并执行与家庭控制器相同的操作。

我在想像父控制器和两个控制器这样的东西。但看起来在 angularjs 控制器继承是由 dom 结构决定的。就我而言,它们是两个不同的页面。所以我无法创建 dom 样式继承。

我很困惑如何在不复制两个控制器中的代码的情况下解决这个问题。

如果需要,我很乐意为这个问题添加更多详细信息。我浏览了许多谷歌结果,但我不知道如何做到这一点。

【问题讨论】:

    标签: javascript angularjs


    【解决方案1】:

    服务(不是控制器)应该拥有域模型,并提供一个model API 给应用程序的其余部分(通常是控制器)使用。

    我建议至少提供两种服务,一种用于您的新闻源,一种用于您的个人资料,也许还有一种用于任何共享函数(这些函数可以作为参数传递给集合或单个帖子)。将适当的服务注入每个控制器。

    “外观”应该在您使用 ng-view 或 ng-include 拉入的 HTML 模板中。模板的 ng-repeat 将引用作为 $scope 属性的集合,该属性是对存储在您的一项服务中的数据的引用。

    有关新闻源服务的示例,以及控制器如何获取对数据的引用,请参阅Should services expose their asynchronicity?

    我不会担心重复使用 $http 服务所需的代码并在每个服务中返回一个承诺。有一天,您的个人资料页面可能会开始与您的新闻源页面看起来/行为有所不同。

    【讨论】:

      【解决方案2】:

      将用于格式化和显示的逻辑拉入实用 Angular 服务 (app.factory)。然后您可以将其注入两个控制器并以这种方式共享逻辑。

      【讨论】:

      • 假设我有一个像 'ng-class="getClassForThisElement()"' 这样的元素,如果我将 getClassForThisElement() 放入服务中,它会起作用吗?这是正确的做法吗?
      • 是的。在您的“getClassForThisElement”方法中,调用您的服务并返回值。
      • 如何从作用域变量中删除元素?我应该将整个范围传递给我的服务方法吗?
      • @R.A.J,将数组元素传递给服务上定义的deleteItem() API,并使用indexOf 将其删除。这是使用indexOf 的示例(尽管在控制器中):stackoverflow.com/a/15510357/215945
      猜你喜欢
      • 2015-12-15
      • 2014-03-22
      • 1970-01-01
      • 2013-05-28
      • 1970-01-01
      • 1970-01-01
      • 2014-06-29
      • 2014-12-14
      • 1970-01-01
      相关资源
      最近更新 更多