2013-07-17 61 views
3

我完全是Backbone的新手,所以请指点正确的方法来做到这一点。这里是我有:Backbone.js:基于用户输入的动态模型/收集网址

  1. 一个骨干登录视图有3个输入:serverIP,用户名,密码。我正在做所有验证,并根据用户必须先输入的serverIP将jquery ajax()请求发送到我的后端主机。
  2. 我的后端是使用Slim restful框架的js PHP,像通常的基本东西一样检查用户,密码。
  3. 在成功调用ajax()的回调函数中,我想为所有模型和集合的后续使用设置urlRoot,因为我使用Slim来处理所有数据库交互以及位于服务器上的此PHP文件。

我试图将其设置在app.js这样的全球应用变量:

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,从用户输入获取登录表单上的服务器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? 
    
    }, 
    
    
    }); 
    
+0

你没有给出任何相关的代码。试着用一个静态的url根,然后重构你的代码,这样url根就变成动态的。您可以使用模型来保存用户凭据和服务器URL。 – mpm

+0

我使用相关代码编辑了我的问题。请再检查一次。谢谢! – user2589700

回答

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。

+0

谢谢您的输入!我采取自己的方式来做骨干的loginModel,但我仍然不知道如何从模型/集合中访问serverIP。请检查我上面的编辑。谢谢! – user2589700