2015-03-30 5 views
1

Я создал директиву внутри моего контроллера, в который я хочу включить другой контроллер в директиву. Ошибка я получить обратно есть Error: [ng:areq] Argument 'js/controllers/testview/DocumentController.js' is not a function, got undefinedУгловой контроллер: Аргумент не является функцией, получил неопределенный

TestviewController

app.controller('TestviewController', ['$http', '$scope', '$sessionStorage', '$state', '$log', 'Session', 'api', function ($http, $scope, $sessionStorage, $state, $log, Session, api) { 
    var module_id = $state.params.id; 

    $http.get(api.getUrl('componentsByModule', module_id)) 
     .success(function (response) { 
      $scope.components = response; 
     }); 
}]); 

app.directive('viewDoc', function() { 
    return { 
     templateUrl: "tpl/directives/testview/document.html", 
     controller: "js/controllers/testview/DocumentController.js", 
     resolve: { components: function() { return $scope.components }} 
    }; 
}); 

DocumentController

app.controller('DocumentController', ['$http', '$scope', '$sessionStorage', '$state', '$log', 'Session', 'api', 'components', function ($http, $scope, $sessionStorage, $state, $log, Session, api, components) { 
    $scope.components = components; 
}]); 

Я довольно новое с directices, но есть ли какие-либо идеи, что я делаю неправильно?

+0

В этом случае контроллер не является файлом js, это фактически имя контроллера в области приложения i.e. 'controller:« TestviewController »' – maurycy

ответ

3

Внутри объекта определения директивы свойство controller ожидает строку с именем функции или самой функцией (не путь к файлу скрипта).

app.directive('viewDoc', function() { 
    return { 
     ... 
     controller: "DocumentController", 

    }; 
}); 
1

Вы хотите вызвать контроллер по имени, а не по имени файла:

controller: "js/controllers/testview/DocumentController.js" 

должен быть

controller: "DocumentController" 
0

вы уверены, что вам нужен контроллер директивы? Я думаю, что вы пытаетесь достичь, это функция ссылок.

вы можете использовать функции директивной ссылки, такие как контроллеры.

.directive('myDialog', function() { 
    return { 
    restrict: 'E', 
transclude: true, 
scope: {}, 
templateUrl: 'my-dialog.html', 
link: function (scope, element) { 
    scope.name = 'Jeff'; 
} 
    }; 
}); 

смотреть на угловые документы https://docs.angularjs.org/guide/directive

1

Там нет возможности поставить контроллер по его URL в определении директивы. Однако, если вы определяете свой контроллер в шаблоне DOM, вы можете использовать controller: 'myController as myCtrl' в определении директивы