2015-07-21 2 views
0

Я пытаюсь сделать 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, как это, но он не работает Аякс запроса, потому что $scope.dataSource является undefined.

<users class="col-sm-4" data-source="/data/users.json"></users> 
+0

Попробуйте изменить 'data-source' на' source'. Я не могу вспомнить, где, но я, хотя я видел, что атрибуты 'data-' не хорошо сочетаются с настраиваемыми директивами – Sean

+1

@vinayakj, это не связано с AJAX, проблема в том, что URL-адрес, который он пытается перейти в его директиву не определено – Sean

+0

@Sean Использование только 'source' также дает' undefined' –

ответ

0

Переместить его функции часов:

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; 
       }); 
       } 
      }); 
     } 
    }; 
}); 
+0

Почему downvote? – jantimon

+0

Я не спускал вниз, но вы можете использовать '$ http' в' link', не определяя его? –

+0

Да, я получаю это с первой строки – jantimon

0

Вам не нужен 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. 
      }); 
     } 
    }; 
}); 
0

Использование $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 в контроллере.

Смежные вопросы