AngularJS isolate指令 - 数据不在.controller中绑定(但在.link中工作)

时间:2016-10-22 08:17:04

标签: angularjs angularjs-directive angularjs-controller angular-controller

在AngulerJS 1中创建了一个自定义指令。它具有隔离范围,并且是数据感知的(从服务器API获取数据)。它的定义如下:

var dirJobView = function ($location, serviceData) {
    return {
        restrict: 'A',
        templateUrl: '/app/views/Jobs/Item.html',
        scope: {
            itemid: "@"
        },
        controller: ['$scope', function ($scope) {
            scope = $scope;
            // does not work - data is not displayed in view:
            serviceData.get('jobs', scope.itemid).then(function (data) {
                scope.dataJobView = data;
            });
        }],
        link: function (scope, elem, attrs, ctrl) {

        }
    };
}

以上操作无效 - 数据已加载,但视图未显示。更确切地说,如果我在浏览器中强制“清除缓存和硬重新加载”,它只会显示它。

但是,如果我将服务调用移动到链接函数,那么它的工作效果很好:

var dirJobView = function ($location, serviceData) {
    return {
        restrict: 'A',
        templateUrl: '/app/views/Jobs/Item.html',
        scope: {
            itemid: "@"
        },
        controller: ['$scope', function ($scope) {
            scope = $scope;

        }],
        link: function (scope, elem, attrs, ctrl) {
            // Moved from controller, now works
            serviceData.get('jobs', scope.itemid).then(function (data) {
                scope.dataJobView = data;
            });
        }
    };
}

据我所知,link函数用于操作DOM,控制器用于调用服务和定义行为。对服务数据的调用应该放在控制器中,不应该吗?

为什么以上工作方式如此?

1 个答案:

答案 0 :(得分:0)

发现问题。错过了一个" var" in" scope = $ scope;"。控制器def body应该是这样的:

'redirect' => sprintf("%s://%s/callback",
      isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' ? 
      'https' : 'http', 
      $_SERVER['SERVER_NAME']
);