2

ajax呼び出しを作成するとき-私は通常、純粋なHTMLを要求します。しかし今、いくつかの理由で、Jsonオブジェクトを受け取ったときにテーブル(人とそのデータなど)を構築する方法についてアドバイスが必要です-Javascriptでテーブルを作成する方法を知っています-しかし、私はこのJsonの概念に慣れていないので-from-server正しい方法でやりたい

私のjsonがこれだとしましょう:

[[name: foo, email:foo@bar.com ...][name:baz,...] ... []]

そのためのテーブルを構築するためにjsを構築する正しい方法は何ですか。私の推測では、次のようなものになります。

var table = {
    init : function() {..}
    new : function(Json) {..} 
    delete : function(Json) {..}
}

var row = {
    init : function() {..}
    new : function(rowParam) {..}
}

var cell = { ... }

私の質問は次のとおりです。

  1. 私はこれが正しい方法であるかどうかを理解しようと暗闇の中を歩きます-そうですか?

  2. ここでMVCから何かがにおいがします-そうですか?MVCパターンで正しくビルドするにはどうすればよいですか?このテーブルが非常にインタラクティブである必要があると仮定します(多くのイベントと操作)

  3. 「こういうことをやっているjsライブラリがある」という匂いもします。自分が何をしようとしているのかを自分で定義するのは難しいので、どこから始めればいいのかわかりません。

4

2 に答える 2

1

まず、json の形式を修正する必要があります。オブジェクト形式の配列を扱っているので、

[
  { 
    propery: "some value", 
    property2: "some other value"
  },
   //.... more objects {} here
];

コードに飛び込む前に、サーバーからの応答が文字列として返されるため、JavaScript オブジェクトに「コンパイル」する必要があることを知っておく必要があります。あなたは2つの方法でそれを行うことができます

  1. メソッドを使用した好ましいJSON.parse(someString);方法
  2. 醜くてあまり望ましくないのは、evalまたはFunction次のような方法を使用することですvar result=[]; eval("result=" + responseStringFromServer);

より良いので、常に最初のアプローチを使用してください。理由がわからない場合は、このリンクを確認してください

タイプ (Table、Row、および cell) を使用したいので、JSON は JavaScript Object Notation に不足しているため、役に立たないことを知っておく必要があります。つまり、var myArray= JSON.parse(responseFromServer);myArray を実行すると、各項目が Javascript オブジェクトである JavaScript 配列になります。下層の型が何であるかを知る必要がない場合は、オブジェクトを変換しないでください

実際の例はここにあります そして、これがどのように機能するかです

データ用にhtmlにプレースホルダーが必要です。次のようになります。

<table id="personDataTable">
    <tr>
        <th>Id</th>
        <th>First Name</th>
        <th>Last Name</th>
    </tr>
</table>

このようなajaxから結果を得たとしましょう

[
   {
       id: 1,
       firstName: "Peter",
       lastName: "Jhons"
   },
   {
       id: 2,
       firstName: "David",
       lastName: "Bowie"
   }
]

データを描画するには、この 3 つの方法を使用できます

// This will iterate over each result in array (as you mentioned the javascript table)
function drawTable(data) {
    for (var i = 0; i < data.length; i++) {
        // call method to draw each row
        drawRow(data[i]);
    }
}

function drawRow(rowData) {
    // create html table row
    var row = $("<tr />")
    // append it to HTML teable element
    $("#personDataTable").append(row); 
    // append each cell to row html element with data in it
    row.append($("<td>" + rowData.id + "</td>"));
    row.append($("<td>" + rowData.firstName + "</td>"));
    row.append($("<td>" + rowData.lastName + "</td>"));
}

最後に、ajax 呼び出し (もちろん jQuery を使用)

$.ajax({
    url: '/echo/json/',
    type: "post",
    dataType: "json",
    data: {
        //... pass here any data you want to your server
    },
    success: function(data, textStatus, jqXHR) {
        // since we are using jQuery, you don't need to parse response
        drawTable(data);
    }
});

そして、この投稿の最後に、このプロセスを簡素化できる多くのニース ライブラリがあることを知っておく必要があります。BackboneJS や AngularJs のように複雑な状況で使用するために実際に使用されるものもあれば、テンプレート エンジンのみである jQuery.template や jQuery.render のように単純なものもあります。アプリの複雑さと、単一ページで発生する「レンダリング」の数によって異なります。

上記の例と同じですが、AngularJS を使用しています

実際の例はここにあります

次のようなページが必要です。

<html ng-app="myApp">
<head>
<title>Example 2</title>
<script type="text/javascript" src="http://code.angularjs.org/1.0.1/angular-1.0.1.min.js"></script>
<style type="text/css">
table {
  border: 1px solid #666;   
    width: 100%;
}
th {
  background: #f8f8f8; 
  font-weight: bold;    
    padding: 2px;
}
</style>
</head>
<body>
<!-- Assign Controller to element, it will handle the "data scope" and events of ineer elements -->
<div ng-controller="PeopleCtrl">
     <!-- Example of attaching event handler to link click event -->
    <p>    Click <a ng-click="loadPeople()">here</a> to load data.</p>
<table>
    <tr>
        <th>Id</th>
        <th>First Name</th>
        <th>Last Name</th>
    </tr>
    <!-- here is how to receptively render array of object using ng-repeat directive. Note that you have defined people attribute in $scope object, it is bound to this template below --> 
    <tr ng-repeat="person in people">
        <td>{{person.id}}</td> <!-- bind single attribute -->
        <td ng-template="{{person.firstName}} {{person.lastName}}"></td> <!-- binding 2 attributes to same element using ng-template directive -->
    </tr>
</table>
</div>
<script type="text/javascript">
// define your module (application)
var app = angular.module('myApp', []);
// define controller responsible to get data and bind result to page
function PeopleCtrl($scope, $http) {

    $scope.people = []; //this will be used in page template above
    // event handler for link which you need to click in order to get data  
    $scope.loadPeople = function() {
        // change link to hit your server json
        var httpRequest = $http.get("/link/to/people.json");
        // on success of HTTP GET request above handle response and set new data
        httpRequest.success(function(data, status) {
            $scope.people = data;
        });

    };

}​
</script>

</body>
</html>
于 2012-08-19T20:57:23.143 に答える
1

あなたの質問をさかのぼって、私は最初に #3 に答えます。DataTablesと呼ばれる JavaScript ライブラリを調べて、目的の処理を行うことができます。また、テーブルとのやり取りが多く必要な場合は、jqGridを調べることもできます。どちらも jQuery プラグインです。

多くのイベントや操作が行われている場合は、 KnockoutJSEmber、またはそこにある他の多くのライブラリのような、より多くの MVVM アプローチを見ているように思えます。しかし、あなたが提供したものに基づいて、MVC アプローチに従っているかどうかはわかりません。

最後に、あなたが提供したスケルトン JS に基づいて、適切なアプローチのようです。テーブル、行、およびセルを個別の関数に分割しています。ここでは、ユーザーのテーブルとの対話によって発生したイベントを処理すると想定しています。tableまた、参照rowrow参照があると仮定していますcell。それは些細なことかもしれませんが、おそらく、JSLint が文句を言わないように、反対方向にそれらを定義したいと思うでしょう。

これが役立つことを願っています。質問があればさらに詳しく説明できます。幸運を!

于 2012-08-19T20:58:45.507 に答える