gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 06:28:18 27 4
gpt4 key购买 nike

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

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

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

...然后使用该对象图中的数据(仅限单向绑定(bind)),如下所示...

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

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

但是,如果我将使用的 HTML 包装在 Controller 中,我就能够以预期的方式重复更新其范围,并且修改会正确反射(reflect)在页面中。

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 来完成此操作,还是只能在 Controller 内完成?另外,是否有更推荐的模式来实现此类操作?具体来说,我需要一种方法来替换 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);

最佳答案

除了非常非常罕见的情况或调试目的之外,这样做只是糟糕的做法(或表明糟糕的应用程序设计)!

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

  1. 访问您知道是应用程序一部分的元素并将其包装为 jqLit​​e/jQuery 元素。
  2. 通过访问 .scope().$root 获取元素的范围,然后获取 $rootScope。 (还有其他方法。)
  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 :(';
});
}
<小时/>

另请参阅此 short demo

<小时/>

编辑

Angular 1.3.x 引入了一个选项来禁用将调试信息附加到 DOM 元素(包括 scope): $compileProvider.debugInfoEnabled()
建议在生产中禁用 debug-info(出于性能考虑),这意味着上述方法将不再起作用。

如果您只想调试实时(生产)实例,您可以调用 angular.reloadWithDebugInfo() ,这将重新加载页面启用调试信息。

或者,您可以采用 B 计划(通过元素的注入(inject)器访问 $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 :(';
});
}

关于angularjs - 如何从 Angular 外部访问/更新 $rootScope,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24595460/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com