【问题标题】:Backbone.js: Dynamic model/collection url based on user inputBackbone.js:基于用户输入的动态模型/集合 url
【发布时间】:2013-07-17 03:08:30
【问题描述】:

我对 Backbone 完全陌生,所以请指出正确的方法。这是我所拥有的:

  1. 具有 3 个输入的主干登录视图:服务器 IP、用户名、密码。我正在根据用户之前必须输入的 serverIP 进行所有验证并将 jquery ajax() 请求发送到我的后端主机。
  2. 我的后端是使用 Slim RESTful 框架的 js PHP,检查用户、密码就像平常的基本东西一样。
  3. 在成功调用 ajax() 回调时,我想设置 urlRoot 以供以后使用所有模型和集合,因为我正在使用 Slim 进行所有数据库交互以及位于服务器上的这个 PHP 文件。

我尝试在 app.js 中像这样在全局 app 变量上设置它:

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

};

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

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

并尝试在骨干模型 url 中使用 app.api_url 但它显然是未定义的。

可能这不是我正在尝试的正确方法并且我搞砸了变量范围?那么如何从视图中设置 model.url 呢?请,任何建议都非常感谢。

谢谢, 饿了

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

  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,从登录表单的用户输入中获取服务器IP并发送到服务器进行处理

    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?
    
    },
    
    
    });
    

【问题讨论】:

  • 您没有提供任何相关代码。尝试使用静态 url 根,然后重构您的代码,使 url 根成为动态的。您可以使用模型来保存用户凭据和服务器 url。
  • 我用相关代码编辑了我的问题。请再检查一次。谢谢!

标签: backbone.js


【解决方案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将使用数据对象中的当前值。

【讨论】:

  • 感谢您的意见!我采用您在主干中进行 loginModel 的方式,但我仍然不知道如何从模型/集合访问 serverIP。请检查我上面的编辑。谢谢!
猜你喜欢
  • 2013-07-24
  • 2012-05-25
  • 1970-01-01
  • 1970-01-01
  • 2011-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-02
相关资源
最近更新 更多