【问题标题】:Access parent controller methods from directive?从指令访问父控制器方法?
【发布时间】:2015-06-28 21:19:39
【问题描述】:

我有一个关于项目搜索的页面的问题。

假设我有:

  1. 具有要显示的结果项控制器
  2. 一个服务,它执行搜索查询并与控制器交互以更新要显示的结果项
  3. 一个指令,其表单包含搜索字段的所有输入。

其中一个按钮是“查看更多项目”按钮。仅当我从查询中收到的响应告诉我有更多要查看的项目时,才应显示它。

我在 service 中创建了一个函数,它检查此属性并将布尔值返回给 directive,该指令将其与按钮上的 ng-show 一起使用以显示或隐藏它。

问题是我不知道如何在这个范围内与控制器进行交互。

指令是否应该调用一个服务方法并且该方法应该以某种方式与控制器交互?

在此之前,我使用表单标签(在指令范围之外)包装指令,然后我可以使用 ng-submit 在 controller 上执行一些操作以调用 服务。像这样:

<form ng-submit="myController.submitSearch">
    <search-options-directive></search-options-directive>
    <button type="submit">
</form>

但现在我要做的是将表单和按钮放入

<search-options-directive></search-options-directive>

所以现在我无法直接调用 controller 方法。

我应该如何处理这个问题?

【问题讨论】:

  • 这听起来像是搜索指令中“require”选项的主要示例——简而言之:创建一个外部指令,其控制器是“项目显示控制器”。然后您可以在搜索指令中要求外部指令,瞧,您可以直接访问控制器。以下是指定要求的编译服务的一些参考:docs.angularjs.org/api/ng/service/$compile
  • 另一个答案可能更好,但也有 scope.$parent 属性。

标签: angularjs model-view-controller angularjs-directive angularjs-scope angular-services


【解决方案1】:

我的回答更具体到您的标题“从指令访问父控制器方法”。在您的指令中,您必须添加要共享的方法:

return {
   scope: {
     myFavoriteMethod:'&'
   }
}

然后:

<search-options-directive my-favorite-method="myMethodOnTheParentController"></search-options-directive>

在您的指令中,您需要添加到您的 html:

 ng-click="myFavoriteMethod()"

但在您的示例中,您使用的是 ng-submit 按钮,该按钮将表达式绑定到 onsubmit 事件(覆盖原始提交操作),这与 ng-click 不同,但您应该能够使用相同的模式。

【讨论】:

  • 感谢您的反馈。我真正想知道的是做我想做的事的最佳实践,因为我不知道要采取的方法,因为我似乎有 3 个非常相互依赖的元素。
  • 最佳实践是遵循基本的矿权封装等。为此,我建议像你开始做的那样进入它自己的指令,然后修改我的示例以使用 ng-submit 而不是 ng -点击。
  • 任何公寓,我不是指住房,哎呀!
  • @Jeffarese 为您完成了这项工作,您可以在哪里应用它来满足您的需求?
  • 这样我不能在被调用的方法(父控制器)中使用这个指针。它总是使用指令 this。
猜你喜欢
  • 1970-01-01
  • 2016-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-19
  • 1970-01-01
  • 2015-07-08
相关资源
最近更新 更多