在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,控制器用于调用服务和定义行为。对服务数据的调用应该放在控制器中,不应该吗?
为什么以上工作方式如此?
答案 0 :(得分:0)
发现问题。错过了一个" var" in" scope = $ scope;"。控制器def body应该是这样的:
'redirect' => sprintf("%s://%s/callback",
isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' ?
'https' : 'http',
$_SERVER['SERVER_NAME']
);