使用CodeIgniter和AngularJS的API REST(开始工作;删除、保存和更新不工作)
我正在用CodeIgniter 3和AngularJS构建一个API REST。视频是西班牙语的,但它是一个伟大的材料: 我无法理解为什么我能够从数据库中检索书籍(这是我们正在制作的一个小型书籍数据库,作为示例)。但我无法删除、编辑或添加它们 目前只关注删除一本书: 如果我点击列表中的第一本书,我会得到:使用CodeIgniter和AngularJS的API REST(开始工作;删除、保存和更新不工作),angularjs,codeigniter,rest,Angularjs,Codeigniter,Rest,我正在用CodeIgniter 3和AngularJS构建一个API REST。视频是西班牙语的,但它是一个伟大的材料: 我无法理解为什么我能够从数据库中检索书籍(这是我们正在制作的一个小型书籍数据库,作为示例)。但我无法删除、编辑或添加它们 目前只关注删除一本书: 如果我点击列表中的第一本书,我会得到: DELETE http://localhost/codeigniter/restangularjs/books/1 400 (Bad Request) 如果我点击列表中的第二本书,我会得到同
DELETE http://localhost/codeigniter/restangularjs/books/1 400 (Bad Request)
如果我点击列表中的第二本书,我会得到同样的错误,只是在末尾有数字2
因此,系统知道调用哪个控制器,甚至向它传递正确的图书id(第一本书的编号为1,第二本书的编号为2)
下面我附上删除一本书所需的所有相关文件。我不知道从哪里开始,希望能得到一些指导
我觉得奇怪的是,在名为Book的工厂(app.js中唯一的工厂)中,我们只定义了update
(在EditCtrl中使用)。例如,我们不定义save
(在CreateCtrl中使用)、delete
或get
(在HomeCtrl中都使用)
另一方面,在我看来,当我们处理REST_控制器(Books.php不是一个CI_控制器,而是一个REST_控制器)update
可以用于所有调用(因此不仅适用于更新,还适用于保存、删除和获取)
我甚至更倾向于这个选项,因为函数Books.get(在HomeCtrl内部)
。。。是唯一正常工作的函数,即使工厂内没有get
调用
但我不知道。我真的不知道。这是我的第一个API REST
我的目录树(仅在包含相关文件夹和文件的xampp/htdocs上):
CodeIgniter-从Books.php(控制器)中提取
AngularJS-从list.html中提取
<a ng-click="remove(book.id)">Delete</a>
删除
您想让我们调试这么长的代码吗?询问调试帮助在SO是离题的。我明白问题所在,是的。但除此之外,我该如何提出我的问题呢?您认为从代码示例中只提取相关的行是一个好主意吗。这样我的帖子就会短得多。我包含了所有相关的代码,因为我认为这样做比不添加重要内容要好。好的,我删除了与问题没有直接联系的代码。我只留下了与获取和删除书籍有关的代码。http://localhost/codeigniter/restangularjs/books/1
这是错误的链接。这应该是http://localhost/codeigniter/restangularjs/books/index/1
同样,您的index\u delete函数应该是这样的公共函数index\u delete($id)
否则从哪里获得$id
?你想让我们调试这么长的代码吗?询问调试帮助在SO是离题的。我明白问题所在,是的。但除此之外,我该如何提出我的问题呢?您认为从代码示例中只提取相关的行是一个好主意吗。这样我的帖子就会短得多。我包含了所有相关的代码,因为我认为这样做比不添加重要内容要好。好的,我删除了与问题没有直接联系的代码。我只留下了与获取和删除书籍有关的代码。http://localhost/codeigniter/restangularjs/books/1
这是错误的链接。这应该是http://localhost/codeigniter/restangularjs/books/index/1
同样,您的index\u delete函数应该是这样的公共函数index\u delete($id)
从哪里获得$id
?
codeigniter
--restangularjs
----application
------controllers
--------Books.php
------models
--------Books_model.php
angularjs
--ciangularrest
----src
------index.html
------app.js
------components
--------list.html
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
require APPPATH . "/libraries/REST_Controller.php";
class Books extends REST_Controller
{
public function __construct()
{
// Ne vem, če je spodnjo vrstico header('Access-Control-Allow-Origin: *'); varno pisati - fora je v tem, da z zvezdico daš dostop vsem. Preveri.
header('Access-Control-Allow-Origin: *');
header("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept, Access-Control-Request-Method");
header("Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE");
$method = $_SERVER['REQUEST_METHOD'];
if($method == "OPTIONS") {
die();
}
parent::__construct();
$this->load->model('books_model');
}
public function index_get()
{
$books = $this->books_model->get();
if( ! is_null($books))
{
$this->response(array("response" => $books), 200);
} else
{
$this->response(array("error" => "No books available"), 404);
}
}
// Other functions here but not relevant for my post on StackOverflow
public function index_delete()
{
if( ! $id)
{
$this->response(NULL, 400);
}
$delete = $this->books_model->delete($id);
if( ! is_null($delete))
{
$this->response(array("response" => "Book deleted"), 200);
} else
{
$this->response(array("error" => "There was an error"), 400);
}
}
}
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class Books_model extends CI_Model {
public function __construct()
{
parent::__construct();
}
public function get($id = NULL)
{
if( ! is_null($id))
{
$query = $this->db->select("*")->from("books")->where("id", $id)->get();
if($query->num_rows() === 1)
{
return $query->row_array();
}
return NULL;
}
$query = $this->db->select("*")->from("books")->get();
if($query->num_rows() > 0)
{
return $query->result_array();
}
return NULL;
}
public function delete($id)
{
$this->db->where("id",$id)->delete("books");
if($this->db->affected_rows() === 1)
{
return TRUE;
}
return NULL;
}
}
.controller('HomeCtrl', ['$scope', 'Books', '$route', function ($scope, Books, $route) {
Books.get(function(data)
{
$scope.books = data.response;
});
$scope.remove = function(id)
{
console.log("inside remove function; " + "deleting the book with id=" + id);
Books.delete({id:id}).$promise.then(function(data)
{
if(data.response)
{
$route.reload();
}
})
}
}])
.factory('Books', ["$resource", function($resource){
return $resource(
"http://localhost/codeigniter/restangularjs/books/:id",
{id:"@_id"},
{update: {method: "PUT", params: {id: "@_id"}}}
)
}])
<a ng-click="remove(book.id)">Delete</a>