错误:。$ save不是函数(AngularJS)

时间:2015-07-07 07:13:26

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

非GET实例操作$save在我的示例中不起作用。我总是得到错误,$save不是函数。问题是,我不知道在哪里定义$scope.example = new Resource();,因为在我的例子中我使用的是2个控制器。一个用于包含对象的表列表,另一个用于我的模态窗口,您可以在其中执行CRUD操作。 CRUD操作在角度服务中定义。

代码结构如下:

资源服务:

...
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'表达式指定唯一键。

1 个答案:

答案 0 :(得分:0)

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

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

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

});

工厂退回的所有物品都可以使用 该服务在调用时会自动创建一个新对象,从而使对象可用(&#34; this&#34;)

致电服务或工厂保持不变:

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

修改

另请注意,您可以决定您的承诺是进入下一个错误还是成功通话。

就像一个例子:

XHR()
.then(success1,error1)
.then(success2,error2)
.then(success3,error3)
...

成功和错误都是回调函数。 通过使用$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;
        });
   }
}