3

我对 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,从登录表单上的用户输入中获取 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?
    
    },
    
    
    });
    
4

1 回答 1

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

于 2013-07-17T07:43:02.303 回答