Angular Digest 循环正在运行,但 ng-bind 值未更新

2024-04-22

我有一个包含导航栏的父视图,在该视图内部我有一个<div ui-view>渲染我所在的任何子视图的元素。

我想根据子视图的路线有条件地显示/隐藏父视图中的导航栏。现在,我有这个:

<nav ng-show="!vm.hideNavbar">

第一次加载我的应用程序时,vm.hideNavbar设置为 true 并且这按预期工作。

After vm.hideNavbar改为false,绑定值不更新。它还是true.

我的应用程序中的每个控制器都扩展了这个BaseController:

export class BaseController {
        public hideNavbar: boolean;

        constructor(public $scope: IBaseScope, private $state: ng.ui.IStateService) {
            if ($state.current.url === '/login') {
                this.hideNavbar = true;
            } else {
                this.hideNavbar = false;
            }
            $scope.vm = this;
        }
 }

因此,每次加载新控制器时,它都会调用构造函数BaseController并有条件地设置$scope.vm.hideNavbar。如果我立即跑$scope.$apply()在此构造函数的末尾,Angular 会抛出错误,表示摘要循环已在运行。

因此,摘要循环正在运行,但我认为该值并未更新。我唯一的想法是我已经实例化了多个副本BaseController由于我的初始控制器和我导航到的控制器都扩展了该控制器。所以,现在,我的界限值vm.hideNavbar仍在寻找旧控制器。

我的做法正确吗?我该如何解决这个问题?


在这种情况下,我建议选择view inheritance (not controller, not state)。在这里查看更多详细信息:

  • 如何在 angularjs ui-router 中的状态之间共享 $scope 数据? https://stackoverflow.com/q/27696612/1679310
  • 如何继承ui-router中的解析数据 https://stackoverflow.com/q/26513746/1679310

一个工作示例 http://plnkr.co/edit/iCcyvjZ26Et5UPmkttbR?p=preview

我们需要的是一个'root'状态。这将是超级家长任何其他的state (国家家属)。这可能是状态定义:

$stateProvider
  .state('root', {
      abstract: true,
      templateUrl: 'layout.tpl.html',
      controller: MyNamespace.RootCtrl,
  })

  .state('login', {
      parent: "root",
      url: "/login",
      templateUrl: 'tpl.html',
      controller: MyNamespace.LoginCtrl,
  })
  .state('home', {
      parent: "root",
      url: "/home",
      templateUrl: 'tpl.html',
      controller: MyNamespace.HomeCtrl,
  })

甚至其他一些国家等级制度也会以此开始'root' state:

$stateProvider
  .state('parent', {
      parent: "root",
      url: "/parent",
      templateUrl: 'tpl.html',
      controller: MyNamespace.ParentCtrl
  })
  .state('parent.child1', { 
      url: "/child1",
      templateUrl: 'tpl.html',
      controller: MyNamespace.Child1Ctrl
  })
  .state('parent.child2', { 
      url: "/child2",
      templateUrl: 'tpl.html',
      controller: MyNamespace.Child2Ctrl
  })

我们可以看到很多controllers:...正在被定义,它们是:

module MyNamespace {
    // the real SUPER parent of all states
    // but it is about VIEW inheritance (its $scope)
    // not about controller hierarchy
    export class RootCtrl extends BaseController {
    }

    export class HomeCtrl extends BaseController {
    }
    export class LoginCtrl extends BaseController {
    }
    export class ParentCtrl extends BaseController {
    }
    export class Child1Ctrl extends BaseController {
    }
    export class Child2Ctrl extends BaseController {
    }
}

正如片段注释中提到的 - 存在继承,但只是在代码级别。通过的$scope由视图层次结构继承。

视图层次结构中的第一个控制器是RootCtrl事实上,这将是唯一分配(创建)共享参考模型的人rootSetting : {}

它们都源自这个控制器基础:

module MyNamespace {
    export interface IRootSetting {
        hideNavbar: boolean;
    }
    export interface IMyRootScope extends ng.IScope {
        rootSetting: IRootSetting
    } 
    export interface IBaseScope extends IMyRootScope {

    }
    export class BaseController {
        public hideNavbar: boolean;
        static $inject = ['$scope', '$state'];

        constructor(public $scope: IBaseScope, 
                 protected $state: ng.ui.IStateService) {

                  // will be in fact assigned in the RootCtrl only
                  // all others (children) will get that reference
                  // via scope inheritance
                  $scope.rootSetting = $scope.rootSetting || {hideNavbar: false}; 

            if ($state.current.url === '/login') {
                this.$scope.rootSetting.hideNavbar = true;
            } else {
                this.$scope.rootSetting.hideNavbar = false;
            }
        }
    }
}

有了这个根模板,就可以了:

<div>      
  <div ng-if="!rootSetting.hideNavbar"> 
   ... // navbar
  </div>      

  <div ui-view="">
      // standard content of child views
  </div>      
</div>

我们可以看到,这里我们评估共享参考模型rootSetting及其财产hideNavbar

这才是真正的优势view inheritanceUI-Router.

检查实际情况here http://plnkr.co/edit/iCcyvjZ26Et5UPmkttbR?p=preview

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

Angular Digest 循环正在运行,但 ng-bind 值未更新 的相关文章

  • AngularJS 插值错误

    我正在显示房间的属性 作为我正在开发的房间管理应用程序的一部分 这是输出 如您所见 Beamer 英文投影仪 的值为 Sony lamp 01 12 2013 此输出是正确的 但当我打开控制台时 我看到一些有关插值的错误 更大的分辨率 Ca
  • 如何删除 ng-repeat 的默认顺序

    如何停止动态表数据的 ng repeat 内部的默认排序 目前我收到以下订单 地址 客户 ID 姓名 但我想要的是以下顺序 客户 ID 名称 地址 任何帮助我将不胜感激 JS app controller MyController func
  • Typescript 找不到模块

    我在 Typescript 的一个文件 upload ts 中有一个导出的模块 我无法在没有错误的情况下导入到另一个文件 application ts 中 另外 我无法导入 ExpressJS 这是Upload ts
  • Access-Control-Allow-Headers 不允许请求标头字段 Access-Control-Allow-Headers

    我试图通过发布请求将文件发送到我的服务器 但是当它发送时会导致错误 Access Control Allow Headers 不允许请求标头字段 Content Type 所以我用谷歌搜索了错误并添加了标题 http post rootSc
  • TypeScript 代码上的 JSlint - 它还能教我编写更好的代码吗?

    在 TypeScript 生成的代码上使用 JSlint 还能教我编写更好的代码吗 如果是 您能提供一两个例子吗 Thanks 没有 由于生成的 javascript 在不良打字稿 良好打字稿之间是一致的 例如缺少分号 对于打字稿 有一个
  • 根据用户区域设置过滤字符串列表

    当使用 AngularJS 1 6 处理 JavaScript 项目时 我有一个要过滤的字符串列表 例如 假设我的列表包含 rbol cig e a nido and tubo 当过滤西班牙语字符串时 如果我过滤 u 我会期望两者cig e
  • Angular 8 Native Typescript 无崩溃,访问器简写

    角8 我曾经在打字稿方面用作简短的黑客 object accessor accessor accessor to get object accessor accessor accessor 如果其中一个子级为空 则不会冒抛出错误的风险 根据
  • 渲染作为 Prop 传入的 Component

    我怎样才能渲染一个StyledComponent它是作为道具传入的吗 我正在传递一个Spinner组件到我的BarComponent作为渲染的道具 我尝试使用 this props icon in my BarComponent在下面的示例
  • FullCalendar-vue + Typescript:属性“getApi”不存在

    我尝试将 FullCalendar vue 与 Typescript 结合使用 但在访问其 API 时遇到错误 我的日历设置如下
  • 使用 Angular 指令禁用文本选择

    我正在学习 JavaScript 和 AngularJS 我想使用 Angular Directive 禁用文本选择 我有该函数的 JavaScript 代码 function clearSelection if document sele
  • 如何使用有角度的材料创建卡片网格?

    我正在尝试使用 ng repeat 创建每行三张卡片的网格 我有一个普通的 javascript 对象数组附加到范围 下面的代码将为每张卡创建一个新行 div div
  • webpack TS2304 找不到名称“Map”、“Set”、“Promise”

    我有以下 webpack config js var path require path var webpack require webpack module exports entry ng2 auto complete path joi
  • 在 Angular 中让多个调用等待同一个 Promise

    我在一个页面上有多个使用相同服务的控制器 为了举例 我们将服务称为 USER 第一次调用 USER getUser 时 它会发出 http 请求来获取有关用户的数据 调用完成后 它将数据存储在 USER data 中 如果再次调用 USER
  • 仅当显式选择行时才关闭 ui-bootstrap typeahead

    我创建了这个jsBin http jsbin com livuqafe 2 edit来证明我遇到的问题 如果您转到此处 请尝试输入 五 并继续 你的自然反应是输入 五 然后按 Tab 如果你想要 五百 你可以向下箭头一次 但是 在这种情况下
  • TypeScript 中泛型的不安全隐式转换

    TypeScript 编译器tsc编译以下代码 即使使用 strict旗帜 然而 该代码包含一个基本错误 而在 Java 或 C 等语言中可以避免这种错误 interface IBox
  • 如何获取数组作为 GraphQL 解析器的输入

    我想得到一个字符串数组ids查询变量中的参数并在我的解析器中使用它 下面是我的代码 People resolver ts import Resolver Query Mutation Args from nestjs graphql imp
  • Protractor+AngularJS+Jasmine - 测试按住项目

    AngularJS 和 Protractor 非常新 但我认为到目前为止我正在朝着正确的方向前进 我的网站有一个项目列表 当您单击该项目并按住 X 秒时 它会打开一个模式窗口 我如何在 Protractor Jasmine 中模拟这种行为
  • Protractor e2e 测试表头和 , 标签

    我正在使用下表 我想测试每个标签 th td 标签 该标签中的文本以及该文本的计数 HTML 片段 table class table table striped tbody tr th b a Patient Id a b th th b
  • Angular 2 和 TypeScript 的承诺

    我正在尝试使用routerCanDeactivate我的应用程序中的组件的函数 简单的使用方法如下 routerCanDeactivate return confirm Are you sure you want to leave this
  • 如何解决 Typescript 构建中的错误“找不到模块 'jquery'”

    我目前在 ts 文件的顶部有这个import require jquery 我这样做是因为我试图在我的打字稿文件中使用 jquery 但我似乎无法编译它 因为它返回标题中所述的错误 我正在使用 ASP NET CORE 脚本文件夹 tsco

随机推荐

  • C 基本头命令

    我正在尝试为我的编程课从 Linux 重新创建 head 和 tail 命令 我们刚刚开始使用 C 所以我对分配内存和指针的想法很陌生 我想知道为什么这不起作用 include
  • C#:如何将 long 转换为 ulong

    如果我尝试使用 BitConverter 它需要一个字节数组 但我没有 我有一个 Int32 我想将其转换为 UInt32 在 C 中这没有问题 您只需要一个简单的演员阵容即可 由于这样做可能会丢失精度 因此转换是显式的 long x 10
  • 将具有 key=value 对的字符串解析为 JSON

    我的节点应用程序接收以下格式的一系列字符串 a x b y c z 即包含多个空格分隔的字符串key value pairs 将此类字符串转换为以下形式的 JSON 对象的最巧妙方法是什么 a x b y c z 我打赌有一个单行解决方案
  • Spring Boot - 无法从 application.properties 在 xml 中解析属性

    我有一个 Spring Boot 应用程序 My Configuration class使用加载 xml 配置 ImportResource path to xml 其中包含以下行
  • 自动链接:地图如何工作

    我在用TextView 的 android autoLink map 属性转到地图并查找与该文本视图关联的地址 但它的行为很奇怪只找到一些地址 这是我正在尝试的代码
  • 使用 webpack 生成捆绑 TypeScript 定义文件

    我目前正在使用 gulp 来生成我的包的定义文件 如下所示 dtsGenerator default name ngFramework project out Typings raw index d ts 但是 我正在迁移到 webpack
  • 在 Selenium 中捕获 JavaScript 错误

    有没有办法捕获发生的错误DOM in Selenium并且可能与页面中的错误标记相同 举一个简单的例子 假设我试图在一个不存在的 HTML 控件上绑定一个事件 我的浏览器会抛出一个错误 element abcd not found in t
  • pyqt5不显示窗口[重复]

    这个问题在这里已经有答案了 我真的希望有人能帮助我解决这个问题 我正在尝试开始使用pyqt5 并且几乎从我正在学习的课程中复制了这段代码 代码似乎执行没有任何问题 但我应该看到的窗口根本没有出现 我做错了什么 我正在尝试ubuntu 18顺
  • Pycharm交互式控制台不起作用

    我对 python 和 Pycharm 都很陌生 因此 请毫不犹豫地指出我哪里做错了以及如何解决问题 问题是IPython无法像往常一样导入我想要执行的函数 即使 python 文件运行后 我也无法在 IPython 控制台中导入该文件中的
  • 我收到内存异常“System.IO.out of exception”错误

    对于小目录大小 代码工作正常 当目录文件大小很大时 它会给出此错误消息 我的代码 IEnumerable
  • 首选项列表仅显示第一个元素

    我正在开发一个PreferenceActivity与定制Preference意见 我的问题是我创建了一个视图ListView它只显示第一个元素 我发布我的代码和图像 http imageshack us photo my images 54
  • 大括号 {} 替换 Racket 中的“开始”

    是否可以有一个宏 使用大括号 来表示一个语句块 从而替换 begin 关键字 因此 代替 if condition begin statement1 statement2 statement3 statement4 else stateme
  • 协议类型的 inout 变量是否被禁止?

    下面的代码 protocol SomeProtocol class SomeClass SomeProtocol private func doSomethingWith inout someVar SomeProtocol private
  • 同步ScrollView滚动位置 - android

    我的 android 布局中有 2 个 ScrollView 如何同步它们的滚动位置 ScrollView中有一个方法 protected void onScrollChanged int x int y int oldx int oldy
  • 什么是 MVC 框架以及为什么它是必要/有用的?

    我知道 MVC 框架允许您分离业务逻辑 数据库访问和表示 但为什么我们需要一个框架来做到这一点 我们不能将我们的类分开 也许对模型 视图和控制器类使用不同的包 文件夹吗 在我看来 你所说的是 MVC 模式 而不是特定的框架 当然 您可以将所
  • 修复文件“project.pch”已被修改,因为预编译头在 Xcode 中构建错误

    我最近在 info plist 部分中处理我的应用程序 因为我的应用程序将无法在我的测试设备上运行 自构建预编译头以来 文件 project pch 已被修改 需要注意的是 该应用程序在模拟器中运行良好 编辑 现在我收到此错误而不是另一个错
  • 为什么我的自定义图形项目在基于 Qt 的 C++ GUI 应用程序中不断重新绘制?

    我的应用程序有一个 QMdiArea 其中显示子窗口 其中包含 QGraphicsView 派生视图 GfxInteractiveView 的实例 这些视图又可视化包含自定义 QGraphicsItem 派生项目的场景 An image i
  • vim 中更有用的状态栏? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Python Dask - 2 个 DataFrame 的垂直串联

    我正在尝试垂直连接两个 Dask DataFrame 我有以下 Dask DataFrame d A B C D E F 1 4 8 1 3 5 6 6 2 2 0 0 9 4 5 0 6 35 0 1 7 10 9 4 0 7 2 6 1
  • Angular Digest 循环正在运行,但 ng-bind 值未更新

    我有一个包含导航栏的父视图 在该视图内部我有一个 div 渲染我所在的任何子视图的元素 我想根据子视图的路线有条件地显示 隐藏父视图中的导航栏 现在 我有这个 div