7

私がしていること:

Rails 3をJSONサーバーとして使用して、KendoUIコントロールをBackbone.jsに組み込む方法を示すサンプルアプリを作成しています。

これまでのところ、クリックされたリンクに応じて、erbファイル内のテンプレートを管理しているバックボーンビューと、ビュー自体を管理しているバックボーンルーターがあります。

これが終わったら、BackboneとKendoUI(これもかなりクールです)を使いたい人を助けるためのチュートリアルとしてすべてを利用できるようにしたいと思います。

問題:

剣道グリッドは、コンテナテンプレートであるにもかかわらず、UsersViewレンダリングメソッドを介してレンダリングされていません。

現在、ルーターがユーザービューをレンダリングした後、ルーターのユーザーメソッドからグリッドをレンダリングする必要があります。

ここに画像の説明を入力してください

テンプレートがレンダリングされるのは奇妙に思えますが、グリッドはレンダリングされません-または何かが欠けていますか?

コードを見ると、理解しやすくなるかもしれません。

index.html.erb

<h1>Kendo Grid Test</h1>

<div id="nav"></div>


<div id="container">

<!-- The templates below will be placed  here dynamically    -->

</div>

<!-- TEMPLATES -->
<script type="text/template" id="users-grid-template">  
    <p>Users Grid Template</p>

    <div id="users-grid"></div> 


</script>

<script type="text/template" id="posts-grid-template">  
    <div id="posts-grid"></div> 
</script>



<script type="text/template" id="nav-template">
  <div>
    <ul id="nav_container">
        <li><a href="#users">Users</a></li>
        <li><a href="#posts">Posts</a></li>
    </ul>
  </div>
</script>

バックボーンユーザービュー

window.UsersView = Backbone.View.extend({

            initialize: function() {                                
                _.bindAll(this, "render");
                this.usersGrid = _.template($("#users-grid-template").html());
                this.render().el;                   
            },

            render: function() {                
                $(this.el).html(this.usersGrid).fadeIn();
                return this;
            }

        });

バックボーンルーター

window.AppRouter = Backbone.Router.extend({

        routes: {
            'users': 'users',
            'posts': 'posts'

        },

        initialize: function() {            
            this.usersView = new UsersView;
        },      

        posts: function() {
            var container = $("#container");
            container.empty();
        },      


        users: function() { 

            var container = $("#container");
            container.empty();          

            container.append(this.usersView.render().el);

            var UsersData = new kendo.data.DataSource({
                    transport: {
                        read: {
                            url: "/users",
                            dataType: "json"
                        }
                    }
                });             

                var grid = $("#users-grid").kendoGrid({

                    dataSource: UsersData,

                    columns: [
                    {
                        field: "first_name",
                        title: "First Name"
                    },
                    {
                        field: "last_name",
                        title: "Last Name",

                    }]
                });

                container.append(grid);             
        }           
    });



    window.App = new AppRouter();
    Backbone.history.start();

ご覧のとおり、Kendo UIグリッドは動的に生成され<div id="users-grid"></div>、「users-grid-template」に配置されます。ただし、グリッドをテンプレートに取り込むには、別の「追加」メソッドを実行する必要があります。これは不要のようです。

このすべてを配置できるはずです...

ここに画像の説明を入力してください

...UsersViewRenderメソッドの内部-appendメソッドを使用する必要はありません。しかし、私はそれを機能させることができません。

これを構成する方法について何か提案はありますか?または、現在のコードが正しく構造化されているかどうか。

アドバイスは大歓迎です!


編集-簡略化されたソリューション(Derickに感謝)

私はこれを複雑にしすぎていることに気づきました。私はBackboneを使用して、剣道がすでに行っていたこと、つまりグリッドとデータソースの管理を行おうとしていました。

バックボーンは非常にモジュール化されており、今のところ本当に必要なのはルーターだけだったので、ナビゲーションビューを除くすべてのビューを削除し、ルーターを使用して剣道に任せました。

このソリューションは、コードの管理がはるかに簡単で簡単だと思います。(少なくとも私にとっては)

$(document).ready(function(){


        window.Navigation = Backbone.View.extend({
        el: $("#nav"),          

        initialize: function() {            
            _.bindAll(this, "render");
            this.nav = $("#nav-template").html();
            this.render().el;
        },  

        render: function() {
            $(this.el).html(this.nav);
            return this;
        }



        });

    window.nav = new Navigation;  

    window.AppRouter = Backbone.Router.extend({

        routes: {
            'users': 'users',
            'posts': 'posts'

        },

        initialize: function() {            
            var container = $("#container");
            //container.html("#users-grid");
        },      

        posts: function() {
            var container = $("#container");
            container.empty();
        },      


        users: function() { 

            var container = $("#container");
            usersTemplate = _.template($("#users-grid-template").html());
            container.empty(); 
            container.html(usersTemplate);

            var UsersData = new kendo.data.DataSource({
                    transport: {
                        read: {
                            url: "/users",
                            dataType: "json"
                        }
                    }
                });             

                $("#users-grid").kendoGrid({

                    dataSource: UsersData,

                    columns: [
                    {
                        field: "first_name",
                        title: "First Name"
                    },
                    {
                        field: "last_name",
                        title: "Last Name",

                    }]
                });                              
        }           
    });

    window.App = new AppRouter();
    Backbone.history.start();




// Closing jquery tag    
});

うまくいけば、誰かがこれが役に立つと思うでしょう。

次のステップ-これにCRUDを適用します。

4

1 に答える 1

8

この問題は、 を呼び出そうとしたときにセレクターのスコープが不足しているために発生します.kendoGrid。コンテンツを に詰め込んでも、ビューは DOM にel.html(...)アタッチされないため、 を呼び出してもまだ何も見つかりません。el$("#users-grid")

ビューの el を呼び出すことはできkendoGridますが、それを行うには、「#user-grid」セレクターをビューにスコープする必要があります。

Backbone.View.extend({

  render: function(){
    this.$el.html(this.usersGrid);

    this.$("#user-grid").kendoGrid({
      // kendo grid options here 
    });
  }

});

ビューの関数として呼び出すことthis.$は、ビューのショートカット メソッドであり、eljquery セレクターのコンテキストとして使用します。呼ぶのと同じthis.$el.find("#users-grid")

FWIW: 最近は剣道をよく使っており、Backbone が大好きです。ビューのレンダリング メソッド以外で実際に特別な処理を必要とする Kendo コントロールにはまだ遭遇していません。

于 2012-02-09T21:42:58.617 に答える