覆盖控制器中的$ scope不会反映在DOM中

时间:2013-06-25 20:19:45

标签: angularjs angularjs-scope

我正在尝试将整个范围保留到服务中,以便在用户导航然后返回到屏幕后可用并已设置。

我已经创建了一个服务并在那里存储当前范围。后来我将传递给控制器​​的$ scope变量设置为存储在我的服务中,但是在检查DOM之后,我发现它的绑定范围仍然是替换之前存在的范围对象。

如何替换范围以便它也可用于DOM元素?

感谢您的帮助!

下面的代码尝试查看本地范围变量是否已初始化,如果是,则将$ scope设置为它,否则它会继续并正常连接。 this.scope是在控制器的超类中定义和设置的成员变量(未显示)。

function xyzController($scope, stateService) {
    _super.call(this, $scope, stateService);                    
    if (this.scope.hasBeenInitialized) {
        $scope = this.scope;  // $scope is updated but the DOM's scope never changed
        return;
    }

    $scope.hasBeenInitialized = true;

    ...                
}

2 个答案:

答案 0 :(得分:2)

你可以尝试:

if (this.scope.hasBeenInitialized) {
    angular.extend($scope, this.scope);
    return;
}

这会将this.scope的值合并到$scope而不替换变量。

答案 1 :(得分:0)

这不起作用。范围是在Angular内部连接的。为了让您了解任何元素,您可以致电:

angular.element(someDomElement).scope();

并获得其范围。它真的无法像你想要的那样替换范围。但更直接的问题是你只是覆盖了那个特定的变量。这是一个传入的对象。想象一下,你有这个代码:

var myObject = { a: 1 };
function f(obj) {
  obj = { a: 2 };
}
f(myObject);

显然,这不会改变myObject。它将替换函数中的obj,但关于范围的事情是为视图中的所有表达式设置它们(例如,它是任何范围函数中的this)。你需要彻底改变它,我没有办法做到这一点。