2016-05-14 85 views
0

我有一个骨干应用程序和一个RESTful api。我使用Coenraets创建的示例来了解主干应用的架构,但我决定设置自己的结构并仅使用数据进行测试。使用RESTful api与骨干

我想知道从RESTful api返回数据的最佳方式。我目前有我的应用程序文件夹结构设置与模型,集合,视图和服务文件夹。我有一个运行着express的节点服务器来处理后端,并且工作正常。

我想知道的是访问restful data api的最佳做法是什么?我应该在我的服务课程还是在视图课程中这样做?我如何使用我平静的api返回的数据动态地进行这项工作:http://localhost:3000/employees

看起来有很多方法可以做到这一点,现在我只想要一些可行的方法,但最终我想知道什么是最好的方式来做到这一点。最终我想要一个CRUD设置。但我不确定应该在哪里设置。类似于在这里详细描述:http://www.codeproject.com/Articles/797899/BackBone-Tutorial-Part-CRUD-Operations-on-Backbone

我的文件如下:

employeecolletion.js

var Backbone = require('backbone'); 
var Employee = require('../models/employeemodel.js'); 

module.exports = Backbone.Collection.extend({ 
    model: Employee, 
    url:"http://localhost:3000/employees" 
}); 

employeemodel.js

var Backbone = require('backbone'); 
var EmployeeCollection = require('../collections/employeecollection.js'); 

module.exports = Backbone.Model.extend({ 

    urlRoot:"http://localhost:3000/employees" 

    // initialize:function() { 
    //  this.reports = new EmployeeCollection(); 
    //  //this.reports.url = this.urlRoot + "/" + 1 + "/reports"; 

    // } 

}); 

employee.js(员工认为结合到我的模板)

var fs = require('fs'); 
var base = require('./base.js'); 
var EmployeeList = require('../collections/employeecollection.js'); 
var employeeService = require('../services/employeeService.js'); 
var template = fs.readFileSync('app/templates/employee.mu', { encoding: 'utf8' }); 


module.exports = base.extend({ 
    el: '.view', 
    template:template, 
    collection: employeeService.collection, 

    initialize: function() { 
    this.viewModel = { 
     employee_list: this.collection.toJSON() 
     //employee_list: this.collection.fetch() --HERE I EXPERIMENTED WITH FETCHING THE DATA 
    }; 
    this.render(); 
    } 
}); 

employeeservice.js(在服务文件夹中的文件,将理想回报,我只想绑定到我的模板中,他们的员工查看文件的集合)

var EmployeeCollection = require('../collections/employeecollection.js'); 

//if wanting to pass in data manually 
var employee_list = [ 
    { 
     id:1, 
     firstName:"James", 
     lastName:"King", 
     fullName:"James King", 
     managerId:0, 
     managerName:"", 
     title:"President and CEO", 
     department:"Corporate", 
     cellPhone:"617-000-0001", 
     officePhone:"781-000-0001", 
     email:"[email protected]", 
     city:"Boston, MA", 
     pic:"james_king.jpg", 
     twitterId:"@fakejking", 
     blog:"http://coenraets.org" 
    } 
]; 

//HERE I WAS EXPERIMENTING WITH A DIFFERENT SYNTAX TO DO THE FILTERING BY ID 
//IN MY SERVICE AND SIMPLY RETURNING THE FINAL DATA I WANT TO MY VIEW CLASS 

// var employees = new EmployeeCollection({id: id}); 

// employees.fetch({ 
//  success: function (data) { 
//   console.log(data); 
//  } 
// }); 


module.exports = { 
    collection: new EmployeeCollection(employee_list) 
}; 
+0

我不太了解制作自定义API,但我用过的大多数API只是收集和组织在json对象中。 – Popatop15

回答

1

骨干是为RESTful服务。

我会尝试使用一些易于理解的术语来解释基础知识。

所以骨干网基于模型和视图。

型号对数据负责。 这意味着,该模型是从服务器获取数据并存储它的人。 在交互式应用程序中,模型应具有urlurlRoot属性,该属性指示此模型引用的特定资源的URL。 例如,如果我们有一个人的资源,并假设我们正在消耗标准RESTfult服务,我希望类似的东西,以这样的:

var Person = Backbone.Model.extend({ 
    url : 'http://localhost:3000/api/Person' 
}); 

这实际上让我们建立这个模型的新实例,并对其进行操作。 此网址将被模型用于与其相关的所有CRUD操作。

例如,如果我们现在创建一个新的实例:

var person = new Person();

现在,我们有以下的基本CRUD操作:

获取:此方法执行异步AJAX GET请求在幕后,并将数据注入到模型中。 现在,在我们提取数据后,我们可以通过简单地调用getperson.get('name'); *来使用它,假设有name属性。

save此方法正在执行异步AJAX POSTPUT后台请求。 如果型号的idAttribute未定义,它将执行POST,否则PUT。 idAttribute是一个模型属性,用于指示模型的唯一ID。

样品用量:

person.set({name : 'Mor'}); 
person.save(); 

的abvoe将执行与在请求体的name: 'Mor' POST请求。 如果例如我提取了模型,并且已经分配了idAttribute,调用相同的save方法将使用PUT请求。

destroy此方法将在幕后执行DELETE请求。 样本用法:person.destroy();

很明显,我刚刚向你展示了基本的用法,还有更多的选择。

一个集合是一个简单的机型列表,这样没有太多的解释,你可以在这里阅读更多:http://backbonejs.org/#Collection

一个观点是所有你看到的。它是应用程序的视觉部分。 Backbone让我们做什么,是将视图绑定到模型和集合。由此,我们可以创建一些动态内容和视觉效果。

一个基本的观点想这样的事情:

var PersonView = Backbone.View.extend({ 
    el: '.person', 
    initialize: function(){ 
    this.listenTo(this.model, "change", this.render); 
    }, 
    render: function(){ 
    this.$el.html("hello :"+this.model.get("name")); 
    } 
}); 

正如你所看到的,我用listenTo。每次模型更改时都会有一个事件侦听器调用render。 当我提到this.model我指的是一个模式,我将传递给视图时,我抛砖引玉吧:

var view = new View({ model : person});

通过这一点,因为我用listenTo,我的观点正与person模型绑定。

这基本上就是这样。 显然,有很多更多的学习和理解,但这几乎涵盖了基本知识。

请参阅http://backbonejs.org/并阅读更多信息。

+0

谢谢你的解释。它有助于分解事情。但是,当我在我的employeeservice.js文件中使用以下代码行时会发生什么:collection:'new EmployeeCollection()。fetch()'。我期望它使用get调用从我的api返回数据并将其分配给一个集合。在我的employee.js文件中,我应该有一个在初始化函数中分配给我的viewmodel的集合。但是这不起作用。我没有收到任何错误,但是我的模板没有绑定到我期望从获取调用中获得的数据。 –

+0

我基本上想要从employeeservice.js类中返回一个集合,以便它可以分配给employee.js视图中的viewModel。 –

+0

在做了大量的研究之后,似乎这里的帖子回答了我的问题:https://dzone.com/articles/backbonejs-parsing-response。除非我遗漏了某些东西,否则骨干集合上的获取调用将返回一个必须被解析的html响应对象。所以我不认为我可以使用MorKadosh提供的语法。那是对的吗?当我尝试该语法时,我的提取确实返回以下响应对象。 –