AngularJS重载控制器不会更改DOM

时间:2014-02-21 01:43:43

标签: javascript php angularjs rest controller

我有一个angularJs应用程序。

在那里我有一个“LayoutCtrl”(LayoutController),它说(例如)“存在多少个头菜单链接”。

我已经创建了我的控制器和我的服务 - 它工作正常。 现在,在某些情况下,该网站需要新的HeadMenu-Links(例如登录/注销时)或小部件(侧面有额外内容的小盒子)。

所以我从LayoutCtrl到控制器的$ scope(用于稍后抓取它并修改它的值)。

在测试(警告某些值)时,我的$ scope始终是相关值,也是返回的JSON中的更改(来自php服务)。

但DOM不会改变。

它可能是什么?

布局部分:

<div ng-controller="LayoutCtrl">
    <div desc='header' class='header' >
        <a desc='hp_link' class='hp_link'  href="#{{header.index}}">
            <img desc='banner' class='banner'  ng-src="{{header.banner}}" src="zkLib/f/img/ajax-loader-sm.gif">
        </a>
        <div desc='headerRow' class='headerRow'>
            <div desc='headerMenu' class='headerMenu'>
                <span ng-repeat="m in header.mHead">
                    <span desc='hmLink' class='hmLink' >
                        <a desc='headerLink' class='headerLink'  href="{{m.link}}">{{m.text}}
                            <img desc='headerImg' class='headerImg'  ng-src="ico/{{m.image}}" heightt="16px;"/>
                        </a>
                    </span>
                </span>
            </div>
            <div desc='networksMenu' class='networksMenu'>
                <span ng-repeat="n in header.network">
                    <span desc='nwLink' class='nwLink' >
                        <a desc='networkLinK' class='networkLinK'  target="_blank" title="{{n.name}}" href="{{n.link}}">
                            <img desc='networkImg' class='networkImg'  ng-src="zkLib/f/img/icons/{{n.icon}}"/>
                        </a>
                    </span>
                </span>
            </div>
        </div>
    </div>
</div>

控制器:

app.controller("LayoutCtrl", ["$scope", "$route",
"HeaderService", "AppService", "WidgetsService", "FooterService",
function($scope, $route, HeaderService, AppService, WidgetsService, FooterService) {
    $scope.refresh = function(route) {  
        HeaderService.query().then(
            function(result) { $scope.header = result.data }, function(result) {}
        );
        WidgetsService.query().then(
            function(result) { $scope.widgets = result.data }, function(result) {}
        )
        $scope.$route = route;
        alert(JSON.stringify($scope.header));
    };

    $scope.refresh($route);

    AppService.query().then(
        function(result) { $scope.app = result.data }, function(result) {}
    );
    FooterService.query().then(
        function(result) { $scope.footer = result.data }, function(result) {}
    );
    AppService.$scope = $scope;
}]);

其中一项被叫服务:

app.factory('HeaderService', ['$http', '$q',
function ($http, $q) {
    var service = {};

    service.query = function() {
        var data = $http.get(sAddr('header'));
        var deffered = $q.defer();
        deffered.resolve(data);
        return deffered.promise;
    };

    return service;
}]);

(sAddr返回服务的正确服务器路径)

在其他控制器上(例如索引页面,用户页面......)我打电话

AppService.$scope.refresh($route);

强制控制器刷新(新菜单?新小部件?)并正确重新加载(我认为) - 上面代码中的警告打印出正确的json。

但DOM不会改变。 我做错了什么?

我使用来自其他StackOverFlow的示例代码构建了此模式 - 问题:

enter link description here

我在Servoce上构建了一个类似的例子。$ scope.refresh - 调用其他Controller(TestController) - 它工作得很好......但是这里 - 没有差别,没有。

感谢您的回答 - 凯

1 个答案:

答案 0 :(得分:0)

您尝试使用$ scope。$ apply()或$ rootScope。$ digest()来获取DOM中刷新的所有数据。从绑定的控制器外部更新任何模型将更新数据,但Angular不知道它。有时,设置带有$ scope的手表。$ watch并更新控制器内的值将为您提供DOM中的刷新数据。

在你的承诺结束时尝试$ scope。$ digest()也是一种选择。

http://nathanleclaire.com/blog/2014/01/31/banging-your-head-against-an-angularjs-issue-try-this/