【问题标题】:Error: .$save is not a function (AngularJS)错误:.$save 不是函数(AngularJS)
【发布时间】:2015-07-07 07:13:25
【问题描述】:

非 GET 实例操作 $save 在我的示例中不起作用。我总是得到错误,$save 不是函数。问题是,我不知道我必须在哪里定义$scope.example = new Resource();,因为在我的示例中我使用了 2 个控制器。一个用于包含对象的表格列表,另一个用于我的模式窗口,您可以在其中进行 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.'
            },
...];

带表单的视图:

<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 表达式。但我试图使用表单视图而不生成然后工作。但我需要生成的表单视图(上面的示例视图)。

错误信息:

错误:ngRepeat:dupes 中继器中的重复键

不允许在转发器中重复。使用“track by”表达式指定唯一键。

【问题讨论】:

  • 没人能帮我吗? :(
  • 请把详细的代码与工厂或服务名称一起。
  • @RIYAJKHAN 等一下,我会更新我的帖子。
  • @RIYAJKHAN 帖子已更新 :)
  • 我有一些问题 - 1. 在模态窗口的 Ctrl 部分中,如何在“$scope.createItem”函数中获得“newName”?

标签: javascript angularjs crud angularjs-service angular-resource


【解决方案1】:

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

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

.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();

编辑

还请注意,您可以决定您的承诺是否将用于下一个错误或成功调用。

举个例子:

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

【讨论】:

  • 谢谢 gr3g 但我已经知道了。我创建了一个工厂。当我定义resService.name.save(newName); 时,它将数据保存在数据库中。但是当我使用return newName.$save() 时,它就不起作用了。在第一个选项中,我不知道如何向视图发送 Succ/Err 消息。
  • 你在使用 ngRessource?
  • 我不知道.$save,但是.save()是和ngRessource一起使用的
  • 我使用的是正确的 ngResource。 $save 是一个非 GET 实例操作:docs.angularjs.org/api/ngResource/service/$resource。当您处理大数据时,这是更好的做法。稍等一下,我会更新我的帖子
  • 我已经更新了我上面的帖子。请查看:)。对你的问题。 $save 将在浏览器中使用。它将对象保存在数据库中以及.save(),但 $save 更适合保存较大的数据。
猜你喜欢
  • 1970-01-01
  • 2013-10-13
  • 2015-08-07
  • 1970-01-01
  • 2016-04-18
  • 2015-11-07
  • 1970-01-01
  • 2019-12-27
  • 2016-02-05
相关资源
最近更新 更多