Я не могу заставить MEAN JS создать нового клиента

Я новичок в стеке Node JS и MAEN, я следую учебному пособию по MEANJS, чтобы изучить его, и в этом скринкасте ="nofollow">http://www.youtube.com/watch?v=HNpMCFB8TFI&list=PL6rhBJX0L3TWYrwrQIi1_MzQDvVhkUVPI&index=26 мы можем создать нового клиента . Однако я не могу создать нового клиента, так как получаю сообщение об ошибке, в котором говорится, что «объект не является функцией», которая ссылается на эту строку «var customer = new Customers», как предлагает консоль в google chrome. вот код

customersApp.controller('CustomersCreateController', ['$scope', '$stateParams', '$location', 'Authentication', 'Customers',
    function($scope, Customers ) {
            // Create new Customer
            this.create = function() {
                    // Create new Customer object
                    var customer = new Customers ({
                            firstName: this.firstName,
                            surname: this.surname,
                            suburb: this.suburb,
                            country: this.country,
                            industry: this.industry,
                            email: this.email,
                            referred: this.referred,
                            phone: this.phone,
                            channel: this.channel
                    });

                    // Redirect after save
                    customer.$save(function(response) {
                            // Clear form fields
                            $scope.firstName = '';
                            $scope.surname = '';
                            $scope.suburb = '';
                            $scope.country = '';
                            $scope.industry = '';
                            $scope.email = '';
                            $scope.referred = '';
                            $scope.phone = '';
                            $scope.channel = '';

                    }, function(errorResponse) {
                            $scope.error = errorResponse.data.message;
                    });
            };
    }      

]);

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

customersApp.controller('CustomersUpdateController', ['$scope', '$stateParams', '$location', 'Authentication', 'Customers',
function($scope, Customers ) {
    // Update existing Customer
    this.update = function(updatedCustomer) {
        var customer = updatedCustomer;

        customer.$update(function() {
        //wont do anything as the modal will be closed
        }, function(errorResponse) {
            $scope.error = errorResponse.data.message;
        });
    };
}

]);

я действительно был бы признателен за вашу помощь, спасибо заранее


person munzx    schedule 05.10.2014    source источник


Ответы (2)


В вашем списке зависимостей вы передаете $stateParams, $location и Authentication, которые могут не понадобиться.

CustomersApp.controller('CustomersCreateController', ['$scope', '$stateParams', '$location', 'Authentication', 'Customers',
    function($scope, Customers ) {

Независимо от того, порядок, который вы указываете в массиве зависимостей, — это порядок, в котором они будут переданы в ваш контроллер. Итак, в вашем контроллере "$scope" относится к $scope, а "Customers" относится к $stateParams.

Вы, вероятно, можете изменить его, чтобы он выглядел так:

CustomersApp.controller('CustomersCreateController', ['$scope', 'Customers',
    function($scope, Customers ) {

Или, если вам нужны эти услуги:

CustomersApp.controller('CustomersCreateController', ['$scope', '$stateParams', '$location', 'Authentication', 'Customers',
    function($scope, $stateParams, $location, Authentication, Customers ) {
person Joshua    schedule 06.10.2014

Когда вы объявляете контроллер в angular, вы передаете 2 параметра: имя контроллера и массив, содержащий все имена других переменных и модулей, которые требуются контроллеру, и, наконец, метод конструктора контроллера в конце массива. .

Теперь сигнатура метода конструктора должна соответствовать массиву параметров, переданных через массив.

var myApp = angular.module('myApp');
myApp.controllers('myController', ['$scope', 'foo', 'bar', // note the position for these
  function($scope, foo, bar) {                             // match the position of these
    foo.doStuff(bar);
  }
]);

Итак, в вашем примере вы можете видеть, что вы неправильно сопоставляете параметры

customersApp.controller('CustomersCreateController', ['$scope', '$stateParams', '$location', 'Authentication', 'Customers',
  function($scope, Customers ) { // note the arrangement of these parameters

Если вы сопоставите расположение параметров в функции с тем, что объявлено в массиве, вы увидите, что объект Customers фактически сопоставлен с объектом $stateParams, и вы вызываете это как функцию.

Если вы расположите необходимые параметры в соответствии с сигнатурой метода конструктора, тогда ваш пример должен начать работать (при условии, что другой код подключен правильно)

customersApp.controller('CustomersCreateController', ['$scope', 'Customers', '$stateParams', '$location', 'Authentication', // note that we moved 'Customers' to be next to '$scope'
  function($scope, Customers ) {

Причина, по которой ваш другой пример работает, заключается в том, что вы на самом деле не используете модуль Customers нигде в коде.

Также не похоже, что вы используете какие-либо другие необходимые переменные и модули в этом контроллере, и если это так, вам также следует удалить их.

Теперь о том, почему angular делает это? Это потому, что когда вы пропускаете файл JavaScript через инструмент минимизации, эти инструменты очень часто переименовывают переданные параметры функции, чтобы уменьшить общий размер файла.

E.g. function(foo, bar) { /* code */ }

станет function(a, b) { /* code */ }

Таким образом, это дает возможность angular поддерживать способ объявления зависимостей через модули и не удалять их с помощью минимизатора.

person johnhaley81    schedule 06.10.2014