Error: Unknown provider: $elementProvider <- $element

眉间皱痕 提交于 2019-12-29 08:43:20

问题


i am trying to use routing in angularjs application as follows:

app.js

    angular.module('productapp', []).
    config(['$routeProvider', function($routeProvider) {
    $routeProvider.
        when('/productapp', {templateUrl: 'partials/productList.html',   controller: productsCtrl}).
        //~ when('/productapp/:phoneId', {templateUrl: 'partials/phone-detail.html', controller: PhoneDetailCtrl}).
        otherwise({redirectTo: '/productapp'});
}]);

controller.js

function productsCtrl($scope, $http, $element) {
        //~ $scope.url = 'php/search.php'; // The url of our search
        // The function that will be executed on button click (ng-click="search()")
        $http.get('php/products.php').success(function(data){
            alert("hi");
            $scope.products = data;
        });

    $scope.search = function() {
        var elem = angular.element($element);
        var dt = $(elem).serialize();
        dt = dt+"&action=index";
        alert(dt);
        console.log($(elem).serialize());
        $http({
            method: 'POST',
            url: 'php/products.php',
            data: dt,
            headers: {'Content-Type': 'application/x-www-form-urlencoded'}
        }).success(function(data, status) {
            //console.log(data);
            $scope.products = data; // Show result from server in our <pre></pre> element
        }).error(function(data, status) {
            $scope.data = data || "Request failed";
            $scope.status = status;
        });
    }; //....

index.html

<html ng-app = "productapp">
<head>
<title>Search form with AngualrJS</title>
        <script src="../angular-1.0.1.min.js"></script>
        <script src="http://code.jquery.com/jquery.min.js"></script>
        <script src="js/products.js"></script>
        <script src="js/app.js"></script>
</head>
<body>
    <div ng-view></div>
</body>
</html> 

productList.html

<div>
            <label>Search</label>
            <input type="text" name="searchKeywords" ng-model="keywords" placeholder="enter name..." value="{{rs.name}}">
            <button type="submit" ng-click="search()">Search</button>
            <label>Add New Product:</label>
            <input type="text" name="keywords" ng-model="rs.name" placeholder="enter name..." value="{{rs.name}}">
            <input type="text" name="desc" ng-model="rs.description" placeholder="enter description..." value="{{rs.description}}">
            <button type="submit" ng-click="add()">Add</button>
            <button type="submit" ng-click="save(rs.product_id)">Save</button>

            <p>enter product name...</p>
            <table border='2'>
                <th>Name</th>
                <th>Description</th>
                <th>Edit</th>
                <th>Delete</th>

                <tr ng-repeat="product in products" ng-model = 'products'>
                <td>{{product.name}}</td>
                <td>{{product.description}}</td>
                    <td><a href='' ng-click = "fetch(product.product_id)">edit</a></td>
                    <td> <a href='' ng-click = "del(product.product_id)" ng-hide="isHidden">delete</a></td>
                </tr>
            </table>
</div>

when i run this code i get the following error in the console(of google chrome) :

Error: Unknown provider: $elementProvider <- $element

i came to know that this error occurred because i am using the $element in the productsCtrl. but then what should i do? how do i solve this problem?


回答1:


$element is not injectable (it is not something that is registered with the AngularJS injector), so you can't pass it into your controller that way.

Your productsCtrl, and hence your search() method, has access to all of the form data because of the ng-model directives, which setup two-way binding between your form and your controller. E.g., inside your search() method, you already have access to the keywords as $scope.keywords.

See if this works for you:

var dt = $($scope.keywords).serialize();  // or maybe just  $scope.keywords.serialize();

Update: this fiddle http://jsfiddle.net/michelpa/NP6Yk/ seems to inject $element into a controller. (I'm not sure how/why that works... maybe because the controller is attached to a form tag/directive?)

Update #2: injecting $element into a controller is possible, but that "goes deep against the angular way" -- https://groups.google.com/d/msg/angular/SYglWP_x7ew/lFtb75NWNWUJ

As mentioned in the comments, I think the answer to your question is to put your form data into a single, larger object and send that along in your $http request.




回答2:


I don't think you need to inject $element into your controller. Rather, try passing it as an argument to the function that needs it. I'm not sure why exactly this works:

<a ng-click="search($element)">


来源:https://stackoverflow.com/questions/12494825/error-unknown-provider-elementprovider-element

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!