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

AngularJS:Access指令与父控制器的隔离范围

巫马翰翮
2023-03-14
问题内容

我想编写带有隔离范围的指令,但也想使该范围可用于父范围的控制器。我找到了这个解决方案:

<div ng-controller="Main">
  <popupbutton directive-scope="popup"></popupbutton>
</div>

app.directive('popupbutton', [function() {
  return {
    restrict:   "E",
    scope:      {    
      directiveScope: "="
    },
    link:       function(sc, el, attrs) {
      sc.directiveScope = sc;
      sc.testvalue = 'foo';
    }
  };  
}]);

app.controller('Main', function($scope) {
  alert($scope.popup.testvalue);  // Where did the property 'popup' come from?!?
});

参见柱塞。

我觉得这有点丑陋,因为它涉及用HTML编写属性,而在控制器的代码中,您无法确定范围属性的来源。有一个更好的方法吗?

编辑:

此外,似乎在运行控制器“ Main”时$ scope.popup甚至不可用。指令的链接功能尚未执行?


问题答案:

为了保持适当的关注点分离,您不应该混合作用域。更不用说它将很难同步。总结:你的指令不应该知道 什么 对父母范围(或其控制器)和你的控制器不应该知道
任何 有关指令的内部。它们是位于单独层中的单独组件。

在控制器和指令之间进行通信的正确方法是通过指令属性。例如,在弹出窗口的情况下,可以使用一个简单的布尔值来完成。

控制器和指令:

app.directive('popupbutton', [function() {
  return {
    restrict: "E",
    scope: { isOpen: "=" },
    template: '<a ng-click="isOpen = !isOpen">Toggle</a><div>Open? {{isOpen}}'
  };
}]);

app.controller('MainCtrl', function($scope) {
  $scope.isOpen = false;
});

和标记:

<popupbutton is-open="isOpen"></popupbutton>

该方法不需要逻辑,开箱即用,并保持关注点的清晰分离。这是更新的插件:http
://plnkr.co/edit/otIaGCLmiNdGcYEgi60f?p=preview



 类似资料:
  • 问题内容: 我可能会考虑将其完全倒退,但是我正在尝试制作三个嵌套指令,让它们称为:屏幕,组件和小部件。我希望窗口小部件能够触发组件中的某些行为,从而触发屏幕中的某些行为。所以: 我可以使用来在小部件的链接fn中要求父组件,但是如何进一步使组件控制器访问其包含的屏幕呢? 我需要的是WHAT in组件,因此,当您单击小部件的按钮时,它会发出“ screeny!”警报。 谢谢。 问题答案: 您可以通过以

  • 如果不使用隔离作用域,我似乎找不到从指令中调用父作用域上的函数的方法。我知道如果我使用隔离作用域,我可以使用“ 在这个简单的示例中,我想显示一个JavaScript确认对话框,并且只有在确认对话框中单击“确定”时才调用doIt()。使用隔离范围很简单。指令如下所示: 但问题是,因为我使用的是隔离作用域,所以上面示例中的ng hide不再针对父作用域执行,而是在隔离作用域中执行(因为在任何指令上使用

  • 那么,的目的是什么?不能访问通过传递的所有属性。为什么一个max的访问值不能作为而不是 为什么要像那样分配回来? 谢了。

  • 问题内容: 请在这里查看示例 角需要,,以在所述分离的范围对象从父范围访问它来限定。 在这里使用 那么,目的是什么?无法访问通过传递的所有属性。为什么不能将max的一个访问值代替 为什么要分配回来像? 由于此应用程序是由Angular作者编写的,因此我希望有一个理由。 谢谢。 问题答案: attrs的目的是什么? 在与指令相同的元素上定义的属性有几个用途: 它们是将信息传递到使用隔离范围的指令的唯

  • 问题内容: 我似乎找不到不使用隔离范围从指令内调用父范围内的函数的方法。我知道,如果我使用隔离作用域,则可以在隔离作用域中使用“&”来访问父作用域上的函数,但是在不必要时使用隔离作用域会产生后果。考虑以下HTML: 在这个简单的示例中,我想显示一个JavaScript确认对话框,并且仅当他们在确认对话框中单击“确定”时才调用doIt()。使用隔离范围很简单。该指令如下所示: 但是问题是,因为我使用

  • 问题内容: 我正在尝试使用AngularJS创建我的第一个应用程序。但是,如果我需要针对特定​​情况使用指令,我会感到困惑。 我有一个简单的“地图”页面,需要在其中显示所选区域的纬度/经度值。目前,我根本没有使用指令。我在控制器中执行所有操作,并使用局部显示结果。我不打算在其他任何地方重用我的地图视图。这就是为什么我不觉得我需要指令。 另一方面,我读到某个地方,每次您尝试在控制器中操作DOM(我正