如果父级有 ng-if,Angular ng-show 不起作用

2023-11-25

我有一个视图,其中父 div 上有 ng-if ,而某些子元素上有 ng-show 。当嵌套在带有 ng-if 的元素下时,ng-show 似乎无法正常工作。这是 Angular 的错误还是我做错了什么?看看这个笨蛋.

HTML:

<!-- with ng-if on the parent div, the toggle doesn't work -->
    <div ng-if="true">
      <div>
          visibility variable: {{showIt}}
      </div>
      <div ng-show="!showIt">
          <a href="" ng-click="showIt = true">Show It</a>
      </div>
      <div ng-show="showIt">
        This is a dynamically-shown div.
        <a href="" ng-click="hideIt()">Hide it</a>
      </div>
    </div>

    <br/><br/>

    <!-- with ng-show on the parent div, it works -->
    <div ng-show="true">
      <div>
          visibility variable: {{showIt}}
      </div>
      <div ng-show="!showIt">
          <a href="" ng-click="showIt = true">Show It</a>
      </div>
      <div ng-show="showIt">
        This is a dynamically-shown div.
        <a href="" ng-click="hideIt()">Hide it</a>
      </div>
    </div>

JavaScript:

scope.hideIt = function () {
  scope.showIt = false;
};

Thanks,

Andy


Nemesv 上面提到你应该使用$parent,但是虽然工作,但这是not正确的解决方案。该解决方案的问题是:

  1. 它在范围之间创建了高度耦合ng-if和控制器范围。
  2. 因为1、改变ng-if to ng-show会破坏你的代码。
  3. 一旦你要嵌套更多范围,它就会变得一团糟($parent.$parent.$parent....)

解决方案:

快速正确的解决方案是不定义showIt直接在您的范围上,而是将其放置在一个对象中(例如component.isVisible).

解释:

要理解为什么这个看似违反直觉的解决方案有效并且确实是正确的解决方案,您首先需要更多地了解继承如何与 Angular 一起工作:

作用域使用原型继承相互继承,这是 Javascript 中内置的继承形式。这看起来如下:

var myScope = {
    showIt : false
}
var ngIfScope = {};
nfIfScope.__proto__ = myScope;

当你现在get的财产ngIfScope如果对象不存在,它将在其原型中查找以找到它。所以如果你要求ngIfScope.showIt浏览器会执行以下操作:

if (ngIfScope.hasOwnProperty("showIt")) {
    return ngIfScope.getOwnProperty("showIt"); // getOwnProperty does not actually exist in javascript
} else {
    return ngIfScope.__proto__.showIt;
}

(实际上,这是递归发生的,但这对于这个例子来说并不重要)。

Setting不过,属性更简单:

ngIfScope.setOwnProperty("showIt", newValue);

现在我们有了这些信息,我们可以看到您最初的实现到底出了什么问题。

我们从以下范围开始:

var myScope = {
    showIt : false
}
var ngIfScope = {};
ngIfScope.__proto__ = myScope;

当用户单击显示按钮时,将执行以下代码:

ngIfScope.showIt = true;

结果范围是:

var myScope = {
    showIt : false
}
var ngIfScope = {
    showIt : true
}
ngIfScope.__proto__ = myScope;

正如你所看到的,新值被写入ngIfScope,而不是在myScope正如您可能预期的那样。结果是ngIfScope.showIt掩盖了来自的变量myScope and myScope.showIt实际上根本没有改变。

现在让我们看看如果我们将可见性触发器放置在对象中会发生什么。

我们从新的范围开始:

var myScope = {
    component : {
        isVisible : false
    }
};
var nfIfScope = {};
ngIfScope.__proto__ = myScope;

到目前为止没有太大变化。但现在让我们看看当用户单击按钮时会发生什么:

ngIfScope.component.isVisible = true;

通过一些辅助变量,我们可以看到它是如何在浏览器中执行的:

var tempObject = ngIfScope.component; 
tempObject.isVisible = true;

这里的第一行是get手术。自从component没有定义于ngIfScopeJavascript 引擎将查看原型ngIfScope (myScope)在那里找到它,正如我上面所解释的。因此:

tempObject === ngIfScope.__proto__.component === myScope.component 

我们现在直接更改值myScope.component,因此这次变量并没有被掩盖。结果范围是:

var myScope = {
    component : {
        isVisible : true
    }
};
var ngIfScope = {};
var ngIfScope.__proto__ = myScope;

我们现在有了一个工作实现,无需显式绑定到$parent范围,因此范围之间没有(或很少)耦合。原型继承为我们完成了这项工作,嵌套作用域也可以开箱即用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如果父级有 ng-if,Angular ng-show 不起作用 的相关文章

随机推荐

  • 基于视图的 NSOutlineView 没有 NIB?

    NSOutlineView是一个子类NSTableView 而目前 NSTableView支持两种实现 基于细胞 基于视图 制作 OSX 10 8 Finder 风格的侧边栏 具有自动灰色图标样式 需要使用基于视图的表视图和源列表突出显示样
  • 如何从路径中提取每个文件夹名称?

    我的路径是 server folderName1 another name something another folder 如果我不知道路径中有多少个文件夹并且不知道文件夹名称 如何将每个文件夹名称提取到字符串中 非常感谢 string
  • 无法在 __init__.py django 1.9.4 中导入模型

    我的目录结构是 Mypack gt init py gt admin py gt apps py gt foo py gt models py 在 apps py 中 我有 AppConfig 我在 foo py 中有一些方法 它们使用从
  • EscapeUriString 和 EscapeDataString 有什么区别?

    如果只处理url编码 我应该使用转义Uri字符串 我对现有的答案不满意 所以我决定更深入地挖掘来解决这个问题 令人惊讶的是 答案非常简单 有 几乎 没有正当理由使用Uri EscapeUriString 如果您需要对字符串进行百分比编码 请
  • 使用 Google Cloud Key Management Service 签署 JSON Web 令牌

    编辑 我找到了答案 滚动到这个问题的底部 我正在开发 NodeJS 身份验证服务器 我想使用 google 签名来签署 JSON Web 令牌 JWT 我正在使用 Google Cloud 密钥管理服务 KMS 并创建了一个密钥环和一个非对
  • C# - 如何知道 Windows 启动后何时“稳定”?

    我正在编写一个应用程序 该应用程序可以选择在 Windows 启动时运行 我无法忍受应用程序在我的电脑真正稳定下来之前就陷入困境 而且这是一个非关键应用程序 我希望我的应用程序礼貌地等待所有其他启动项完成并解决 以便用户的电脑在开始执行任何
  • 使用 ASP.NET MVC 区域路由找不到错误 404

    我在 MVC 5 中遇到区域路由问题 当我浏览到 Evernote EvernoteAuth 时 出现 404 找不到资源错误 我的区域看起来像这样 Areas Evernote Controllers EvernoteAuthContro
  • nodejs hapi 单页

    我有一个应用程序站点 NodeJS 我想从 Express 迁移到 Hapi 我通常做的是提供静态文件并将其他所有内容路由到包含 angularjs 应用程序和 Angular 路由配置的单个页面 Express routing first
  • 两个 Python 模块需要彼此的内容 - 这可以吗?

    我有一个 Bottle 网络服务器模块 其中包含以下行 from foobar formtools import auto process form insert And the foobar formtools模块包含这一行 from f
  • 如何比较多行?

    我想比较两个连续的行i with i 1 of col2 排序col1 If item i of the i第 行和item i 1 row是不同的 我想增加计数item i 1 by 1 col1 col2 row 1 item 1 ro
  • 协作编辑 LaTeX 文档的技巧 [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我的默认设置是将 tex 源放入 subversion 存储库中 并在更改其他人的内容时将注释作为源中的注释相互插入 这一切都感觉不太理想 尤其是当存在颠覆冲突时 它告诉你的只是
  • 除非使用 Leiningen REPL,否则 Clojure jdbc create-table 语句不会运行

    我有一个小型 Clojure 程序 它使用Clojure JDBC在 HSQL 数据库中创建表的工具 然而 如果我从 Leiningen 的 REPL 运行它 它似乎只会实际创建该表 如果我使用运行代码 它不会创建表lein run或从我的
  • Java + Eclipse:同步 stdout 和 stderr

    我使用Eclipse 当我有这样的应用程序时 write 20 times Hello World n to stdout write ERROR n to stderr write 5 times Hello World n to std
  • 如何配置Spring-Boot应用程序以继续使用RestEasy?

    我有一个旧的 Web 应用程序 纯 servlet 没有 Spring 我想将其作为 fat jar 运行 这个应用程序提供了很多REST服务 我不想修改旧代码 如何配置Spring Boot应用程序以继续使用RestEasy 您可以使用
  • 在 Tapestry 5 中更新表单内的区域

    我有一个Zone里面一个Form the Zone已更新为包含我想绑定到父级的输入字段的块Form 不幸的是 这似乎并不像我希望的那么容易 因为我收到了以下错误消息 The Description component must be enc
  • FireFox 位于“从...传输数据”或“读取...”

    我正在使用 Selenium 为网站构建一些功能测试 但我遇到了一个奇怪的浏览器问题 页面似乎永远无法完成加载 状态栏显示 正在从 传输数据 或 读取 由于页面永远不会完成加载 我的硒测试超时 该问题似乎只发生在 FireFox 上 我们的
  • cv2.connectedComponents 未检测到组件

    我使用的是 Ubuntu python 2 7 使用 OpenCV 我试图准确理解函数 cv2 connectedComponents 正在做什么 这是图像 代码 import cv2 import numpy as np img cv2
  • 在 Django 中动态删除内联表单集

    是否可以让 Django 自动删除请求中不存在的表单集 例如 如果在加载编辑页面时我有三个以 HTML 表示的内联表单集 并且在处理请求时使用 javascript 删除其中两个表单集 则 Django 会发现这两个表单不再是它们的 并将它
  • Angular 6 / NGRX 联合减速机

    我正在使用 Angular 6 w NgRX 4 我有多个想要组合的减速器 应用程序模块 ts import BrowserModule from angular platform browser import NgModule from
  • 如果父级有 ng-if,Angular ng-show 不起作用

    我有一个视图 其中父 div 上有 ng if 而某些子元素上有 ng show 当嵌套在带有 ng if 的元素下时 ng show 似乎无法正常工作 这是 Angular 的错误还是我做错了什么 看看这个笨蛋 HTML div div