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

Backbone.js:基于用户输入的动态模型/集合url,backbone.js,Backbone.js,我是个新手,所以请告诉我正确的方法。以下是我所拥有的: 具有3个输入的主干登录视图:serverIP、用户名和密码。我正在进行所有验证,并根据用户之前必须输入的serverIP向后端主机发送jquery ajax()请求 我的后端是js PHP,使用Slim restful框架,检查用户,密码等常用的基本东西 在成功的ajax()调用的回调中,我想设置urlRoot,以便以后使用所有模型和集合,因为我正在使用Slim进行所有数据库交互以及服务器上的这个PHP文件 我尝试在全局app变量上设置它,

我是个新手,所以请告诉我正确的方法。以下是我所拥有的:

  • 具有3个输入的主干登录视图:serverIP、用户名和密码。我正在进行所有验证,并根据用户之前必须输入的serverIP向后端主机发送jquery ajax()请求
  • 我的后端是js PHP,使用Slim restful框架,检查用户,密码等常用的基本东西
  • 在成功的ajax()调用的回调中,我想设置urlRoot,以便以后使用所有模型和集合,因为我正在使用Slim进行所有数据库交互以及服务器上的这个PHP文件 我尝试在全局app变量上设置它,如app.js中所示:

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

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

    app.api_url = "http://"+serverIP;
    
    并尝试在主干模型url中使用app.api_url,但它显然未定义

    可能这不是我正在尝试的正确方法,我把变量范围搞砸了?那么如何从视图中设置model.url?请,任何建议都将不胜感激

    谢谢, 匈奴

    编辑:好的,我将再次尝试详细说明我的问题:

  • 这是myLoginView.js中的登录功能,基本上它接受用户输入并发送到my model与服务器交互,如果成功导航到主视图:

    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 */
    
        }
    
  • 这是我的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': '',
    }
    
    });
    
  • 现在,在成功登录后,导航到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});
    
    }
    
  • 这是我的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?
    
    },
    
    
    });
    

  • 主干网中的所有模型都已经有一个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将使用数据对象中的当前值。

    您没有给出任何相关代码。尝试使用静态url根,然后重构代码,使url根成为动态的。您可以使用模型保存用户凭据和服务器url。我用相关代码编辑了我的问题。请再查一下。谢谢谢谢你的意见!我采用您在主干网中进行loginModel的方式,但我仍然不知道如何从模型/集合访问serverIP。请检查我的编辑上面。谢谢