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 值未更新 的相关文章

随机推荐

  • 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