3

私はバックボーンにまったく慣れていないので、正しい方法を教えてください。ここに私が持っているものがあります:

  1. 3 つの入力を持つバックボーン ログイン ビュー: serverIP、ユーザー名、パスワード。私はすべての検証を行っており、ユーザーが以前に入力しなければならなかった serverIP に基づいて、バックエンド ホストに jquery ajax() リクエストを送信しています。
  2. 私のバックエンドは、Slim restful フレームワークを使用した js PHP です。通常の基本的なものと同様に、ユーザーとパスワードを確認します。
  3. 成功した ajax() 呼び出しのコールバックで、すべてのモデルとコレクションを後で使用するために urlRoot を設定します。これは、すべてのデータベース インタラクションとサーバー上にあるこの PHP ファイルに Slim を使用しているためです。

app.jsで次のようにグローバルアプリ変数に設定しようとしました:

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 に答える