Backbone.js:基于用户输入的动态模型/集合URL

时间:2013-07-17 03:08:31

标签: backbone.js

我是Backbone的新手,所以请指出我正确的做法。这就是我所拥有的:

  1. 具有3个输入的Backbone登录视图:serverIP,用户名,密码。我正在进行所有验证,并根据用户必须先输入的serverIP将jquery ajax()请求发送到我的后端主机。
  2. 我的后端是使用Slim restful框架的js PHP,检查用户,密码就像通常的基本内容一样。
  3. 在成功的ajax()调用的回调中,我想设置urlRoot以供后面使用所有模型和集合,因为我正在使用Slim进行所有数据库交互和位于服务器上的这个PHP文件。
  4. 我尝试在app.js中将其设置为全局app变量:

    var app = {
    api_url: '',
    views: {},
    models: {},
    routers: {},
    utils: {},
    adapters: {}
    

    };

    在登录视图的回调中,我设置了:

    app.api_url = "http://"+serverIP;
    

    尝试在骨干模型网址中使用app.api_url,但显然未定义。

    可能这不是我正在尝试的正确方法,我搞砸了变量范围?然后我如何从视图中设置model.url?请提出任何建议。

    谢谢, Hungnd

    编辑:好的,我会再次尝试解决我的问题:

    1. 以下是 LoginView.js 中的登录功能,基本上它需要用户输入并发送到我的模型与服务器进行交互,如果成功导航到主视图:

      var user = new app.models.Login();
      
      var userDetails = {
          serverIP: $('#serverIP').val(),
          username: $('#username').val(),
          password: $('#password').val()
      };
      
      user.save(userDetails, {
          success: function(data) {
              /* update the view now */
              if(data.error) {  // If there is an error, show the error messages
      
              }   
              else { // If not, send them back to the home page
      
                      app.router = new app.routers.AppRouter();
                      app.router.navigate('home',true);
      
              }
          },
          error: function() {
              /* handle the error code here */
      
          }
      
    2. 这是我的 LoginModel.js ,从登录表单上的用户输入获取serverIP并发送到服务器进行处理

      app.models.Login = Backbone.Model.extend({
      urlRoot: function(){ 
      var serverIP = this.get('serverIP');
      
      return "http://"+serverIP+"/api/login";         
      },
      
      defaults: {
          'serverIP': '',
      'username': '',
      'password': '',
      }
      
      });
      
    3. 现在,成功登录后,导航到 HomeView.js ,初始化调用EmployeeCollection,到目前为止一直很好

      initialize: function () {
      
      //Search result
      this.searchResults = new app.models.EmployeeCollection();
      this.searchResults.fetch({data: {name: ''}});
      this.searchresultsView = new app.views.EmployeeListView({model: this.searchResults});
      
      }
      
    4. 这是我的 EmployeeModel.js ,我遇到了问题,我不知道如何访问serverIP变量。

      app.models.Employee = Backbone.Model.extend({
      
      urlRoot:"api/employees",
      //urlRoot: app.api_url+"/api/employees",
      
         initialize:function () {
             this.reports = new app.models.EmployeeCollection();
             this.reports.url = app.api_url+'/api/employees/' + this.id + '/reports';
         }
      
         });
      
      app.models.EmployeeCollection = Backbone.Collection.extend({
      
      model: app.models.Employee,
      
      //url: "api/employees",
      url: function() {
          //How to get serverIP?
      
      },
      
      
      });
      

1 个答案:

答案 0 :(得分:1)

主干中的所有模型都有一个url属性,用于获取数据。在您的情况下,您可以将其定义为动态生成URL的函数。

以下是一个例子:

//we are inside the definition of the loginModel

data: {
      serverIP : null,
       username : null,
       password : null
          },

url: function() {
        var url = "rootUrl",
        data = this.get("data");
    return function() {
        return url + '?' + $.param(data);
       };
    }
然后将

url定义为闭包,并在javascript中引用对象,生成的url将使用数据对象中的当前值。