【问题标题】:Backbone.js + KendoUI - Routing, Views, and Structuring with GridBackbone.js + KendoUI - 使用网格进行路由、视图和结构化
【发布时间】:2012-02-09 20:42:39
【问题描述】:

我在做什么:

我正在创建一个示例应用程序,展示如何使用 Rails 3 作为 JSON 服务器将 Kendo UI 控件与 Backbone.js 合并。

到目前为止,我有一个管理 erb 文件中的模板的主干视图和一个管理视图本身的主干路由器 - 取决于单击的链接。

完成后,我希望将其作为教程提供给想要进入 Backbone 和 KendoUI(也非常酷)的人们。

问题:

Kendo 网格不通过用户视图渲染方法渲染 - 即使它的容器模板是。

现在,我必须在路由器渲染用户视图之后从路由器的用户方法渲染网格。

模板渲染看起来很奇怪,但网格没有 - 还是我遗漏了什么?

也许你看到代码会更容易理解:

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 网格是动态生成的,并放置在“users-grid-template”的&lt;div id="users-grid"&gt;&lt;/div&gt; 中。但是,我必须执行一个单独的“附加”方法才能将网格放入模板中。这似乎没有必要。

看来我应该可以放置所有这些了...

... 在 UsersView Render 方法中 - 无需使用 append 方法。但我无法让它发挥作用。

关于如何构建它有什么建议吗?或者我当前的代码结构是否正确?

非常感谢您的建议!


编辑 - 简化解决方案(感谢 Derick)

我意识到我过于复杂了。我试图使用 Backbone 来做 Kendo 已经在做的事情——管理它的网格和数据源。

由于 Backbone 是如此模块化,而我目前真正需要的只是路由器,因此我删除了所有视图(导航视图除外),只使用路由器并让 Kendo 完成它的工作。

我认为解决方案更简单,更易于管理代码。 (至少对我来说)

$(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。

【问题讨论】:

    标签: jquery ruby-on-rails ruby-on-rails-3 backbone.js kendo-ui


    【解决方案1】:

    该问题是由于在尝试调用 .kendoGrid 时缺少选择器范围造成的。将您的内容填充到 el.html(...) 不会将您的视图的 el 附加到 DOM,因此对 $("#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.$ 作为视图上的函数调用是视图上的一种快捷方法,可以使用el 作为jquery 选择器的上下文。和调用this.$el.find("#users-grid")是一样的

    FWIW:这些天我经常使用剑道,并且喜欢 Backbone。我还没有遇到需要在视图的渲染方法之外进行任何真正特殊处理的 Kendo 控件。

    【讨论】:

    • 嘿 Derick - 非常感谢您查看我的问题。我仍然遇到一些问题,但我尝试合并您建议的更改,并在顶部进行了编辑,以便您可以看到完整的代码。也许你可以告诉我哪里还有错。我觉得我正处于理解这一点的边缘,但我仍然缺少一些基本的东西。我已经玩了几个小时了,现在我决定去度假了 :)
    • 在新代码中,您将渲染视图两次——一次在视图的初始化方法中,一次在路由器中。摆脱对.render() 的调用之一……我个人会将其从视图的初始化方法中删除。这可能会导致任何遗留问题
    • 嘿,伙计,当你说我要渲染两次视图时,我开始思考 - 我正在尝试让 Backbone 来管理视图,但是 Kendo 网格和数据源确实已经这样做了我。我正在尝试在不必要的时候使用 Backbone 重新创建工作 - 至少对于我现在正在做的事情。我会在以后需要更多自定义控件时保存视图。再次感谢!
    猜你喜欢
    • 2012-07-12
    • 1970-01-01
    • 2013-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-10
    • 2014-04-06
    • 2012-08-04
    相关资源
    最近更新 更多