javascript - 错误 : . $save 不是函数(AngularJS)

标签 javascript angularjs crud angularjs-service angular-resource

非 GET 实例操作 $save 在我的示例中不起作用。我总是收到错误,$save 不是一个函数。问题是,我不知道必须在哪里定义 $scope.example = new Resource();,因为在我的示例中我使用了 2 个 Controller 。一个用于包含对象的表列表,另一个用于我的模式窗口,您可以在其中进行 CRUD 操作。 CRUD 操作在 Angular 服务中定义。

代码结构如下:

资源服务:

...
return {
  name: $resource(baseUrl + '/api/name/:Id', {
     Id: '@Id'
  }, {
     'update': {
        method: 'PUT'
     }
  }),
...

CRUD服务:

...
return {
   create: function (newName) {
      return newName.$save();
   },
...

模态窗口的Ctrl:

$scope.selected = new resService.name();
$scope.createItem = function (newName) {
   CrudService.create(newName).then(
        function () {
           $scope.dataSuccess = 'Person created.';
           $scope.newName = null;
        },
        function (err) {
           $scope.dataError = err.data.ModelState;
        });
   }
}

$scope.form = [{
                label: 'Firstname',
                fieldType: 'text',
                name: 'Fname',
                id: 'fname-id',
                propertyName: 'fname',
                disabled: false,
                pattern: /^[a-zA-Z]{4}[a-zA-Z]*/,
                required: true,
                errRequired: 'Firstname is required.',
                errPattern: 'Firstname has at least 4 letters.'
            },
...];

带有表单的 View :

<form class="form-horizontal" name="editForm" novalidate>
  <div class="form-group-sm has-feedback" ng-repeat="elem in form" ng-class="{ 'has-error' : hasError(editForm, elem.name), 'has-success' : hasSuccess(editForm, elem.name) }">
     <label class="control-label" for="{{elem.id}}">{{elem.label}}</label>
     <input type="{{elem.fieldType}}"
            class="form-control" 
            placeholder="{{elem.label}}"  
            name="{{elem.name}}" 
            id="{{elem.id}}"
            ng-model="selected[elem.propertyName]" 
            ng-disabled="{{elem.disabled}}"
            ng-pattern="elem.pattern" 
            ng-required="{{elem.required}}"
            />

<p class="help-block" ng-if="elem.errRequired" ng-show="editForm[elem.name].$error.required && editForm[elem.name].$touched">{{elem.errRequired}}</p>
<p class="help-block" ng-if="elem.errPattern" ng-show="editForm[elem.name].$error.pattern">{{elem.errPattern}}</p>

编辑: 我收到一个新错误。控制台告诉我必须使用 track by 表达式。但我试图使用表单 View 而不生成然后工作。但我需要生成的表单 View (上面的示例 View )。

错误消息:

Error: ngRepeat:dupes Duplicate Key in Repeater

Duplicates in a repeater are not allowed. Use 'track by' expression to specify unique keys.

最佳答案

如果您不想创建新对象,则需要在服务选项(工厂、服务、提供商)之间选择服务。

工厂和服务之间的区别在于语法。只是语法。

.factory(function(){

   //Private variables and functions
   var x = "ez";
   function getX(){
        return x;
   }

   //Public functions (or variables)
   return {
     a : "test",
     getA : function(){
        return a;    
     }
   }

})


//Service example

.service(function(){

   //Handled by Angular: 
   //new() is used to create a new object

  //Private functions and variables
  var x = "test";
  function getX(){
    return x;
  }

  //Public funcitons (and variables)
  this.a = function(){
     "test";
  };

  this.getA = function(){
    return a;
  };

  //Handeled by AngularJS 
  //return this;

});

工厂退回的所有东西都是可用的。
服务在调用时自动创建一个新对象,这使得该对象(“t​​his”)可用

调用服务或工厂保持不变:

var a = service.getA();
var a = factory.getA();

编辑

还请注意,您可以决定您的 Promise 是转到下一个错误还是成功调用。

就像一个例子:

xhr()
.then(成功1,错误1)
.then(成功2,错误2)
.then(成功3,错误3)
...

成功和错误都是回调函数。 通过使用 $q 您可以转到下一个成功或错误,无论回调如何。

问题代码

 . factory ( 'YourFacotry' , [ '$resource' , 
       function ( $resource ) {    
          return $resource ( '/api/note/:id' , { id : '@id' }, 
             { 
               markAsDone : 
                 { 
                   url : '/api/note/:id/done' , 
                   method : 'POST' , 
                   isArray : true 
                  } 
             }); 
        }]);


Ctrl of modal window:

$scope.createItem = function () { //Forgot $scope here!
   CrudService.query().then(
        function () {
           $scope.dataSuccess = 'Person created';
           $scope.newName = null;
        },
        function (err) {
           $scope.dataError = err.data.ModelState;
        });
   }
}

关于javascript - 错误 : . $save 不是函数(AngularJS),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31262068/

相关文章:

javascript - 在 flexbox 元素之间添加均匀间隔的元素符号点(但仅在元素之间,而不是在包装行的开头或结尾)

AngularJs,无论用户是否连接都更改菜单项

javascript - 我应该怎么做才能限制字符数?

java - 单个 DAO 和通用 CRUD 方法(JPA/Hibernate + Spring)

java - 我的搜索方法出现所有空值

mysql - LIMIT 1 有任何性能提升吗?

javascript - Sequelize 不显示语法错误

javascript - 每个 then() 都应该返回一个值或在 Node JavaScript 中抛出 Promise/Always-return

javascript - Vue.js 来自多个搜索项的粗体术语

javascript - Facebook 分享显示主服务器 IP 地址而不是域名