- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的应用程序在 $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);
最佳答案
除了非常非常罕见的情况或调试目的之外,这样做只是糟糕的做法(或表明糟糕的应用程序设计)!
对于非常非常罕见的情况(或调试),您可以这样做:
.scope().$root
获取元素的范围,然后获取 $rootScope
。 (还有其他方法。)$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/
为什么在此示例中需要 $rootScope.$apply() 来使用页面上的 ng-hide 更新元素? 根据我的经验,每当我将 $scope.$apply() 放入 $scope.$watch 中时
$rootScope 和$rootScope.$root 有区别吗? 有什么区别 $rootScope.global.flag = true 和 $rootScope.$root.global.fla
我想在我的应用程序中共享这些功能,而我的工厂很少。问题是我必须在需要时在每个 Controller 中添加所有这些工厂。随着工厂和 Controller 数量的增加,这是一项乏味的任务! 因此我试图找
我在 $rootScope 上定义了一个方法 $rootScope.method = function(value){ // wanna give this value to `$scope.
我想知道我是否可以在 $rootScope.$on 函数中调用 $rootScope.$emit,原因是我有两个 Controller ctrl1.js 和`ctrl2.js,我想在我的 ctrl1.
谁能帮助理解 $rootScope.$new() 和 $rootScope.$new(true) 之间的区别?根据我的理解,它们应该是相同的,因为 $rootScope 没有父作用域。 最佳答案 $n
在广播和接收广播方面, Angular 1.2 rc2 和 Angular 1.2 之间有什么变化吗? 我有我认为是 $watch Controller 中的标准广播,即 $scope.$wa
我在我的应用程序中将 UI-router 用于嵌套 View ,但同时我想在路由更改时监听事件。在使用 UI-router routeChangeSuccess 之前,它触发得很好,但在 ui-rou
嗨,我想知道在性能方面什么更好。 假设我有一个广播东西的工厂: angular.module('core.foo') .factory('Foo', ['$rootScope',
我在 App.run 中定义了一些模型下面我在 Controller 中覆盖 someCtrl : App.run(['$rootScope', function($rootScope) { $r
我的应用出现以下错误 Error: [$rootScope:infdig] http://errors.angularjs.org/1.4.1/$rootScope/infdig?p0=10&p1=%
在一个 Controller 中,我这样做: $rootScope.$emit("newAction", {}); 在另一个 Controller 我做: $rootScope.$on('newAct
我想将数据从一个 Controller 发送到另一个 Controller 。其实我已经关注了这个link 我的第一个 Controller 是这样的: class ProductCtrl const
用户注销后,我需要清理我的 $rootScope。我试过 $rootScope.$destroy()但这并没有奏效。有没有办法遍历 $rootScope 中的所有值并删除它们或简单地重置它的方法? 最
抱歉,我的英语不好。我有 angularjs 应用程序,有很多页面和表单。对于任何页面,使用该页面的模型创建文件。示例: file userDict.js: $rootScope.dicts.user
当互联网不可用时,我想在每个页面上显示互联网不可用栏。 我正在使用 Ionic 框架,因此决定将代码保留在 menu.html 上 这是我的菜单 html 代码 Internet not availa
我在我的 Controller $rootScope.$on 函数中监听用户登录 $rootScope.$on('$firebaseSimpleLogin:login',functio
我在 Controller 中使用 $rootScope.$on 来监听我正在使用的模块(Angular-packery)发出的事件。它正在工作,它获取事件并且我可以在“args”上执行操作。但我想做
以下文件“有效”(即它不会引发任何错误): angular.module("modx", [], function($routeProvider) {
我有一个更新 $rootScope 的 Angular 服务。更新实际上工作正常,但它在控制台中抛出一个错误,这让我很担心。 app.service("scroll", function($rootS
我是一名优秀的程序员,十分优秀!