如何从 AngularJS 中的自定义指令 * 具有自己的作用域 * 访问父作用域?

2024-04-27

我正在寻找访问指令中“父”范围的任何方式。范围、嵌入、要求、从上面传入变量(或范围本身)等的任何组合。我完全愿意竭尽全力,但我想避免一些完全hacky或无法维护的东西。例如,我知道我现在可以通过采取$scope从 preLink 参数并迭代它$sibling寻找概念“父”的范围。

我真正想要的是能够$watch父作用域中的表达式。如果我能做到这一点,那么我就可以在这里完成我想做的事情:AngularJS - 如何渲染带有变量的部分? https://stackoverflow.com/questions/17863732/angularjs-how-to-render-a-partial-with-variables

重要说明是该指令必须在同一父范围内可重用。因此,默认行为(范围: false)对我不起作用。我需要指令的每个实例都有一个单独的范围,然后我需要$watch位于父作用域中的变量。

一个代码示例相当于 1000 个单词,因此:

app.directive('watchingMyParentScope', function() {
    return {
        require: /* ? */,
        scope: /* ? */,
        transclude: /* ? */,
        controller: /* ? */,
        compile: function(el,attr,trans) {
            // Can I get the $parent from the transclusion function somehow?
            return {
                pre: function($s, $e, $a, parentControl) {
                    // Can I get the $parent from the parent controller?
                    // By setting this.$scope = $scope from within that controller?

                    // Can I get the $parent from the current $scope?

                    // Can I pass the $parent scope in as an attribute and define
                    // it as part of this directive's scope definition?

                    // What don't I understand about how directives work and
                    // how their scope is related to their parent?
                },
                post: function($s, $e, $a, parentControl) {
                    // Has my situation improved by the time the postLink is called?
                }
            }
        }
    };
});

See AngularJS 中的范围原型/原型继承有哪些细微差别? https://stackoverflow.com/questions/14049480/what-are-the-nuances-of-scope-prototypal-prototypical-inheritance-in-angularjs

总结一下:指令访问其父指令的方式($parent) 范围取决于指令创建的范围类型:

  1. 默认 (scope: false) - 该指令不会创建新的作用域,因此这里没有继承。该指令的范围与父级/容器的范围相同。在链接函数中,使用第一个参数(通常为scope).

  2. scope: true- 该指令创建一个新的子作用域,其原型继承自父作用域。在父作用域中定义的属性可供该指令使用scope(因为原型继承)。请注意写入原始范围属性 - 这将在指令范围上创建一个新属性(隐藏/隐藏同名的父范围属性)。

  3. scope: { ... }- 该指令创建一个新的隔离/隔离范围。它通常不会继承父作用域。您仍然可以使用访问父范围$parent,但通常不建议这样做。相反,您应该通过使用该指令的同一元素上的附加属性来指定该指令需要哪些父作用域属性(和/或函数),使用=, @, and &符号。

  4. transclude: true- 该指令创建一个新的“嵌入”子作用域,其原型继承自父作用域。如果该指令还创建了隔离作用域,则嵌入作用域和隔离作用域是同级作用域。这$parent每个作用域的属性都引用相同的父作用域。
    角度 v1.3 更新:如果该指令还创建了隔离作用域,则嵌入的作用域现在是隔离作用域的子级。嵌入范围和隔离范围不再是同级范围。这$parent嵌入范围的属性现在引用隔离范围。

上面的链接包含所有 4 种类型的示例和图片。

您无法访问指令的编译函数中的范围(如此处所述:https://github.com/angular/angular.js/wiki/Dev-Guide:-理解指令 https://github.com/angular/angular.js/wiki/Dev-Guide:-Understanding-Directives)。您可以在链接函数中访问指令的范围。

观看:

对于上面的 1. 和 2.:通常您通过属性指定指令需要哪个父属性,然后 $watch 它:

<div my-dir attr1="prop1"></div>
scope.$watch(attrs.attr1, function() { ... });

如果您正在观察对象属性,则需要使用 $parse:

<div my-dir attr2="obj.prop2"></div>
var model = $parse(attrs.attr2);
scope.$watch(model, function() { ... });

对于上面的 3(隔离范围),请使用以下命令观察您为指令属性指定的名称@ or =符号:

<div my-dir attr3="{{prop3}}" attr4="obj.prop4"></div>
scope: {
  localName3: '@attr3',
  attr4:      '='  // here, using the same name as the attribute
},
link: function(scope, element, attrs) {
   scope.$watch('localName3', function() { ... });
   scope.$watch('attr4',      function() { ... });
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从 AngularJS 中的自定义指令 * 具有自己的作用域 * 访问父作用域? 的相关文章

随机推荐

  • SVG 元素绕圆旋转

    所以我有一个 SVG 元素 大圆圈 和里面的一组元素 我想围绕这个大圆圈旋转这些元素 代码非常简单 但我已经开始担心如何在正确的路径 大圆圈 上设置这个圆圈 graph skils 正如您在下面的链接中看到的 这个小圆圈在大圆圈上旋转不正确
  • 调试严重的 SIGILL 崩溃:文本段损坏

    我们的系统是基于 PowerPC 的运行 Linux 的嵌入式系统 我们遇到了随机的 SIGILL 崩溃 这种情况在各种应用程序中都会出现 崩溃的根本原因是将要执行的指令归零 这表明内存中的文本段已损坏 由于文本段是以只读方式加载的 因此应
  • openpyxl 图表误差线样式

    我被分配了一项 简单 的任务 即将一系列数据列收集到结果工作簿中 结果工作簿包含分析结果所需的公式和图表 这些数据是由我用 python 编写的图像分析应用程序生成的 作为一系列 Excel 工作簿 现在的问题是 openpyxl 会删除
  • 如何验证当前用户 ASP.net mvc Identity

    当用户访问我的网站时 他们会看到登录页面 一旦他们成功登录 他们就可以注销并且其他用户可以登录 但是 如果用户在登录时单击后退按钮 则会转到登录页面 此时新用户无法再登录 我收到防伪令牌错误 我尝试注销任何进入登录页面的用户 我尝试过不同的
  • 在 CodeIgniter 会话中存储具有相同名称的多个输入

    我已经发布了这个在 CodeIgniter 论坛中 http codeigniter com forums viewthread 155508 并且也耗尽了论坛搜索引擎 所以如果交叉发帖不被允许 我们深表歉意 本质上 我有一个输入 设置为
  • 如何将基于 Qt4.6 Phonon 的媒体应用程序移植到 Qt 5.1?

    我有一个基于 Qt 4 6 的应用程序 它使用 QtWebView 加载带有标签的 HTML 页面 以便在 Windows 平台上播放网络多媒体源 我没有使用默认的 PHONON 播放引擎 而是构建了另一个 PHONON 后端引擎来处理媒体
  • 帮助手册中的锚点不起作用

    我已经仔细检查了所有内容 希望有人能发现我没有看到的愚蠢错误 我正在尝试为我的应用程序构建一个 Apple 帮助部分 它可以正确地转到登录页面 但是没有一个锚点起作用 登陆页面称为index html另一个页面称为test html它位于p
  • 如果相机平移也在 Z 方向,单应性在平面场景的两个图像之间是否成立?

    我正在尝试计算两个图像之间的相对姿势 并且我正在使用单应性来过滤特征匹配 我有一个相当平面的场景 只要两个图像之间的平移仅限于 X 和 Y 轴 opencv 约定 基于单应性的相对姿态估计就可以非常准确地工作 一旦我开始使用另一个相机沿 Z
  • .NET Core:Process.Start() 留下 子进程

    我正在构建一个部署在 CentOS 7 2 上的 ASP Net Core netcore 1 1 应用程序 我有一个通过 System Diagnostics Process 调用外部进程 也是使用 net core 构建的控制台应用程序
  • iOS/MacOS 框架中是否有为 CFBundleShortVersionString 定义的常量

    我知道 CFBundleVersion plist 键有一个常量 定义为kCFBundleVersionKey在 CoreFoundation 的 CFBundle h 标头中 但是 CFBundleShortVersionString 有
  • 可以用Java开发iPhone应用程序吗?

    无意间看到这样的广告 http monotouch net DownloadTrial ref so1 http monotouch net DownloadTrial ref so1 然后我开始怀疑 Java 中是否有类似的东西 据我了解
  • 是否可以通过 URL 调用 Web API 来获取实时数据?

    假设您有一个 ASP NET MVC 4 Web API 项目 当您通过 URL 调用其中一个资源时 它会等待获取指定时间段的性能监控数据 然后在完成后以 JSON 形式返回所有数据 但是 在输入 URL 和过程完成之间 是否有一种方法可以
  • 我们是否需要更喜欢构造函数而不是静态工厂方法?如果是的话,什么时候?

    我一直在阅读有效的Java by 约书亚 布洛赫到目前为止 它确实名副其实 第一项就提供了令人信服的理由静态工厂方法 over 构造函数 以至于我开始质疑那些好的旧构造函数的有效性 本书的优点 缺点总结如下 优点 他们有名字 我们拥有全面的
  • Predict() - 也许我不理解它

    I 今天早些时候发布 https stackoverflow com questions 9026383 error in predict关于我使用时遇到的错误predict功能 我能够纠正这个问题 并认为我走在正确的道路上 我有许多观察结
  • TFS2012错误的用户丢失工作区

    我的 TFS2012 有一个非常不寻常的问题 我们刚刚跨域迁移并从 TFS2010 升级到 TFS2012 一切似乎都与一个用户无关 我们似乎无法让他的工作空间正常工作 当我连接到 TFS 服务器时 我输入服务器名称和端口号 这会连接 但在
  • 如何向 CellList 添加或删除单个元素?

    如何添加 删除单个元素CellList http google web toolkit googlecode com svn javadoc 2 1 com google gwt user cellview client CellList
  • 在github上打开时如何更改Visual Studio的版本

    我有VS2015和VS2017 当我在 GitHub 上选择 在 Visual Studio 中打开 时 我想将其更改为使用 VS2017 而不是 VS2015 我怎样才能做到这一点 通过另一个问题找到了答案 使用 github 时 找不到
  • 在 Neo4j 中可视化连接的组件

    我可以使用下面的代码找到图中最密集连接的组件 CALL algo unionFind stream pnHours YIELD nodeId setId groupBy setId storing all node ids of the s
  • 如何同时(并行)调用远程计算机上的相同功能

    我正在编写一个脚本 该脚本具有多个需要时间在不同远程计算机上执行的函数 有什么方法可以以并行方式同时调用命令它们吗 举个例子将不胜感激 谢谢 Invoke Command已经对每台计算机并行执行调用 作为内置功能的一部分 https tec
  • 如何从 AngularJS 中的自定义指令 * 具有自己的作用域 * 访问父作用域?

    我正在寻找访问指令中 父 范围的任何方式 范围 嵌入 要求 从上面传入变量 或范围本身 等的任何组合 我完全愿意竭尽全力 但我想避免一些完全hacky或无法维护的东西 例如 我知道我现在可以通过采取 scope从 preLink 参数并迭代