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

如何从Angular外部访问/更新$ rootScope

巫马修然
2023-03-14
问题内容

我的应用程序在$ rootScope中初始化一个对象图,如下所示:

var myApp = angular.module('myApp', []);

myApp.run(function ($rootScope) {
    $rootScope.myObject = { value: 1 };
});

…然后使用该对象图中的数据(仅1向绑定),就像这样…

<p>The value is: {{myObject.value}}</p>

这项工作正常,但是如果我随后(在页面渲染完成之后)尝试更新$
rootScope并将原始对象替换为新对象,则将其忽略。我最初以为这是因为AngularJS保留了对原始对象的引用,即使我已经替换了它。

但是,如果将使用方的HTML包装在控制器中,则可以按预期的方式重复更新其范围,并且修改正确地反映在页面中。

myApp.controller('MyController', function ($scope, $timeout) {
    $scope.myObject = { value: 3 };

    $timeout(function() {
        $scope.myObject = { value: 4 };

        $timeout(function () {
            $scope.myObject = { value: 5 };
        }, 1000);
    }, 1000);
});

有什么方法可以通过$
rootScope完成此操作,还是只能在控制器内部完成?另外,是否有更推荐的模式来实现这种操作?具体来说,我需要一种方法来替换AngularJS从AngularJS代码外部使用的完整对象图。

预先感谢您的建议,蒂姆

编辑:如注释中所建议,我尝试在$ apply内执行更改,但这无济于事:

setTimeout(function() {
    var injector = angular.injector(["ng", "myApp"]);
    var rootScope = injector.get("$rootScope");

    rootScope.$apply(function () {
        rootScope.myObject = { value: 6 };
    });

    console.log("rootScope updated");
}, 5000);

问题答案:

除了非常少见的情况或调试目的外,这样做只是BAD的实践(或BAD应用程序设计的一种指示)!

对于非常罕见的情况(或调试),您可以这样进行:

  1. 访问您知道属于应用程序一部分的元素,并将其包装为jqLit​​e / jQuery元素。
  2. $rootScope通过访问获取元素的Scope,然后获取.scope().$root。(还有其他方法。)
  3. 尽您所能,但将其包装在中$rootScope.$apply(),这样Angular就会知道发生了什么并发挥了魔力。

例如:

function badPractice() {
  var $body = angular.element(document.body);  // 1
  var $rootScope = $body.scope().$root;        // 2
  $rootScope.$apply(function () {              // 3
    $rootScope.someText = 'This is BAD practice :(';
  });
}

另请参 见此简短演示

编辑

Angular 1.3.x引入了一个选项,以禁止将调试信息附加到DOM元素(包括scope)上: $
compileProvider.debugInfoEnabled()

建议在生产中禁用调试信息(出于性能考虑),这意味着方法将不再起作用。

如果你只是想调试活动(生产)情况下,你可以调用
angular.reloadWithDebugInfo()
,这将刷新页面 调试信息功能。

或者,您可以使用Plan B($rootScope通过元素的注入器访问):

function badPracticePlanB() {
  var $body = angular.element(document.body);           // 1
  var $rootScope = $body.injector().get('$rootScope');  // 2b
  $rootScope.$apply(function () {                       // 3
    $rootScope.someText = 'This is BAD practice too :(';
  });
}


 类似资料:
  • 问题内容: 我正在尝试学习JavaFX,并将swing应用程序转换为JavaFX。我想做的是使用JavaFX来显示程序的进度。 我以前在Swing中所做的是首先使用自定义JComponent创建一个JFrame。然后让我的主程序调用自定义JComponent的方法,该方法将更改JComponent和repaint()中的形状颜色。 下面给出了我想在JavaFX中实现的目标的想法: 我目前将此作为我

  • 问题内容: 我正在使用AngularJS框架构建HTML应用程序。我有一些旧的JavaScript操作,需要访问Angular对象中的函数,但无法使其正常工作。 这是Angular对象(我需要访问的函数是): 我试图通过访问它,但是没有结果(控制台说)。我尝试转储的结果,并且获得了完整的对象列表和所有内容。从理论上讲,我的第一个示例应该可以,但是不能。 非常感谢我如何实现这一目标的任何指导! 当我

  • 问题内容: 我有一个称为“播放器”的服务,并且在Flash对象完成加载后需要更新该服务。 我知道如何使用 但是当我需要更新模块中已经创建的实例时,它将返回“玩家”的新实例。有没有办法做到这一点?我只想要播放器的一个实例,但是我需要从外部javascript对其进行初始化。 问题答案: 好吧,我真的看不到您正在做的所有事情,但是您大概只有1/2处。 这是我要描述的工作总结 应该返回与应用程序中的服务

  • 问题内容: 是否可以从Java内部类中获取对它的引用? 即 问题答案: 您可以像这样访问外部类的实例:

  • 问题内容: 我正在开发非OSGI应用程序,我需要更新骆驼路线中使用的某些属性的值(已加载BridgePropertyPlaceHolder)。所以我认为: 要使用酷炫的管理控制台Hawtio,以便使用JMX更新骆驼 创建一个将更新属性..的JMX MBean。 我成功创建了MBean操作并使用JMX对其进行了调用,但是我不知道如何更新依赖于这些属性的骆驼路线。 有没有一种方法可以从外部更新骆驼上下

  • 下面是静态嵌套类