我的应用程序在$ 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应用程序设计的一种指示)!
对于非常罕见的情况(或调试),您可以这样进行:
$rootScope
通过访问获取元素的Scope,然后获取.scope().$root
。(还有其他方法。)$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对其进行了调用,但是我不知道如何更新依赖于这些属性的骆驼路线。 有没有一种方法可以从外部更新骆驼上下
下面是静态嵌套类