Я пытаюсь сделать http-запрос в моем контроллере, но мой $scope.dataSource
возвращается как undefined
, и я не уверен, почему. Я строю директиву следующим образом:
app.directive('users', function(){
return {
restrict: 'E',
templateUrl: '/templates/dashboard/config/users.html',
scope: {
dataSource: '@'
},
controller: function($scope, $http){
$http({
url: $scope.dataSource
}).success(function(data){
$scope.data = data;
});
}
};
});
И html вроде этого, но он не запускает запрос ajax, поскольку параметр $scope.dataSource
не undefined
.
<users class="col-sm-4" data-source="/data/users.json"></users>
Переместите его в функцию часов:
app.directive('users', function($http) {
return {
restrict: 'E',
templateUrl: '/templates/dashboard/config/users.html',
scope: {
source: '@'
},
link: function($scope){
$scope.watch('source', function(source) {
if (dataSource !== undefined) {
$http({
url: source
}).success(function(data){
$scope.data = data;
});
}
});
}
};
});
$http
в link
без ее определения?
Вам не нужен controller
вам понадобится link
функцию и передать scope
и $http
к нему.
app.directive('users', function($http){
return {
restrict: 'E',
templateUrl: '/templates/dashboard/config/users.html',
scope: {
dataSource: '@'
},
transclude: true,
link: function(scope, elem, attrs){
$http({
url: scope.dataSource
}).success(function(data) {
$parent.$scope.data = data; // where data is a model in parent controller.
});
}
};
});
Использование $attrs
позволяет мне получить значение следующим образом:
app.directive('users', function(){
return {
restrict: 'E',
templateUrl: '/templates/dashboard/config/users.html',
scope: {
dataSource: '@'
},
controller: function($scope, $http, $attrs){
$http({
url: $attrs.source
}).success(function(data){
$scope.data = data;
});
}
};
});
Я все еще использую dataSource
в области и html, но использую $attrs.source
в контроллере.
data-source
наsource
. Я не могу вспомнить, где, но я хоть где-то видел, что атрибутыdata-
плохо работают с пользовательскими директивами