为什么rootScope失去了它的权威

时间:2016-04-06 10:59:45

标签: angularjs

我有一个像这样的控制器,

type

移动时效果很好,

(function () {
    'use strict';

    angular.module('myControlleringApp').controller("myController", ['$rootScope', myController]);

    function myController($rootScope) {
        $rootScope.status = "loading";

        $("#myIFrame").attr('src', "Templates/myControllerViewer.aspx");
        $('#myIFrame').load(function ($rootScope) {
            // some other logic
            $rootScope.status = "loaded";
        });
    };
})();

超出$rootScope.status = "loaded"; 方法。但除此之外它并没有改变我的观点。

以下是一些HTML

load

1 个答案:

答案 0 :(得分:1)

load回调中的$ rootScope参数屏蔽了您注入控制器的那个参数:

$('#myIFrame').load(function ($rootScope) { // Creates new variable in 
                                            // the callback's scope!
    $rootScope.status = "loaded"; // This is now referring to the callback's 
                                  // parameter, not the service.
});

所以你实际做的是:

$rootScope.status = "loading";

$('#myIFrame').load(function (randomNewParam) {
    randomNewParam.status = "loaded"; // Not $rootScope!
});

看起来您可能希望$rootScope注入load回调 - 事实并非如此! According to the jQuery docs,回调应采用以下形式:

$('#myIFrame').load(function (event) {
    $rootScope.status = "loaded";
});

请注意,现在参数名称已更改,真实的$rootScope可再次从控制器功能的范围中获得 - 这将为您提供所需的功能!也就是说,正如Dhaval Marthak在评论中提到的,你真的不应该使用$rootScope来传递应用程序周围的值 - 它实际上与创建全局变量相同。服务和依赖注入是可行的方法。