动态渲染视图

  • 当待渲染的视图内容不多的时候,可以将视图元素放在控制器或者状态里
  1. var views = document.getElementById("views");
  2. views.innerHTML = ""; //将元素内容清空
  3. var container = document.createElement("div");
  4. container.id = "user"; //设置id
  5. var name = document.createElement("span");
  6. name.innerHTML = data.name;
  7. container.appendChild(name);
  8. views.appendChild(container);
  9. //或使用jquery
  10. $("#views").empty();
  11. var container = $("<div/>").attr({id: "user"});
  12. var name = $("<span/>").text(data.name);
  13. $("#views").append(container.append(name));
  • 此外也可以将静态页面包含再页面中,再必要时候显示或隐藏;

模版

js模版的核心概念是,将包含模版变量的HTML片段和JavaScript对象做合并,把模版变量替换为对象中的属性值, 以下都以jquery.tmpl模版为例

  1. <script type="text/javascript">
  2. var object = {
  3. url: "https://www.google.com/",
  4. getName: function () {
  5. return "testName";
  6. }
  7. };
  8. var tmpl = '<li><a href="${url}">${getName()}</a></li>';
  9. var elem = jQuery.tmpl(tmpl, object);
  10. $("body").append(elem);
  11. </script>
  12. //
  13. <script id="tmpl" type="text/template">
  14. <li><a href="${url}">${getName()}</a></li>
  15. </script>
  16. <script type="text/javascript">
  17. var object = {
  18. url: "https://www.google.com/",
  19. getName: function () {
  20. return "testName";
  21. }
  22. };
  23. var elem = $("#tmpl").tmpl(object);
  24. elem.appendTo($("body"));
  25. </script>
  • 一些高级功能
  1. <script type="text/template" id="tmpl">
  2. {{if url}}
  3. ${url}
  4. {{/if}}
  5. {{if messages.length}}
  6. <ul>
  7. {{each messages}}
  8. <li>${$index + 1}: <em>${$value}</em></li>
  9. {{/each}}
  10. {{else}}
  11. no messages
  12. {{/if}}
  13. </script>
  14. <script type="text/javascript">
  15. var object = {
  16. url: "https://www.google.com/",
  17. messages: ['one', 'two']
  18. };
  19. var elem = $("#tmpl").tmpl(object);
  20. $("body").append(elem);
  21. </script>

可以用$value变量来访问当前正被遍历的值;数组元素的索引可以使用$index变量来输出

模版helper

有时再视图内部使用通用helper函数,比如格式化一个日期或数字;为了保持mvc架构,最好的方法应该是将它们抽象出来,并用命名空间进行管理,而不是直接将函数掺进视图中,这样才能保持逻辑和视图之间的解偶

  1. //替换一段纯文本中的<a></a>标签里的链接
  2. <script type="text/tamplate" id="tmpl">
  3. ${helper.autoLink(this.data)} //这里data指代tmpl()方法传入的数据;
  4. </script>
  5. <script type="text/javascript">
  6. var helper = {};
  7. helper.autoLink = function(data) {
  8. var re = /((http|https|ftp):\/\/[\w?=&.\/-;#~%-]+(?![\w\s?&.\/;#~%"=-]*>]))/g;
  9. console.log(data);
  10. return (data.replace(re, '<a target="_blank" href="$1">$1</a>'));
  11. };
  12. var elem = $("#tmpl").tmpl("https://github.com/maccman/jquery.tmpl");
  13. $("body").append(elem);
  14. </script>

模版存储

包括

  • JavaScript中以行内形式存储;//违背了MVC架构原则,不推荐
  • 在自定义script标签里以行内形式存储; //推荐,通过Id来获取模版引用;浏览器不会对它们进行渲染而仅解析为内容文本
  • 远处加载; //注意速度问题
  • 在HTML中以行内形式存储
  1. <script type="text/tamplate" id="tmpl">
  2. <span>${getName()}</span>
  3. </script>
  4. <script type="text/javascript">
  5. var data = {
  6. getName: function() {return "Bob"}
  7. };
  8. var element = $("#tmpl").tmpl(data);
  9. element.appendTo($("body"));
  10. </script>
  • 在程序后台,jquery.tmpl会确保模版一旦生成后,解析后的模版就能被缓存住,而不必2次解析;
  • 首先根据内容生成元素,然后将它追加到页面中,这种方式性能比操作已经追加至页面的元素更好,这是一种最佳实践
  • 实际上运用一些“依赖管理工具”会更加简洁,如RequireJS

绑定

绑定将视图元素和js对象(通常是模型)挂接在一起;当js对象发生改变时,视图会根据新修改后的对象做适时更新

为了将js对象和视图绑定在一起,需要设置一个回调函数,当对象的熟悉发生改变时发送一个更新视图的通知

  1. var addChange = function (ob) {
  2. ob.change = function(cb) {
  3. if(cb) {
  4. if(!this._change) this._change = [];
  5. this._change.push(cb);
  6. } else {
  7. if(!this._change) return;
  8. for(var i = 0, len = this._change.length; i < len; i++) {
  9. this._change[i].apply(this);
  10. }
  11. }
  12. }
  13. }
  14. var object = {};
  15. object.name = 'Foo';
  16. addChange(object);
  17. object.change(function() {
  18. console.log("Changed!", this);
  19. //添加更新视图的代码
  20. });
  21. object.change();
  22. object.name = "Bar";
  23. object.change();

给这个对象添加了change()回调, 这样就可以执行绑定和触发change事件

模型中的事件绑定

  1. <script type="text/javascript" charset="utf-8">
  2. var User = function(name){
  3. this.name = name;
  4. };
  5. User.records = []
  6. User.bind = function(ev, callback) {
  7. var calls = this._callbacks || (this._callbacks = {});
  8. (this._callbacks[ev] || (this._callbacks[ev] = [])).push(callback);
  9. };
  10. User.trigger = function(ev) {
  11. var list, calls, i, l;
  12. if (!(calls = this._callbacks)) return this;
  13. if (!(list = this._callbacks[ev])) return this;
  14. jQuery.each(list, function(){ this() })
  15. };
  16. User.create = function(name){
  17. this.records.push(new this(name));
  18. this.trigger("change")
  19. };
  20. jQuery(function($){
  21. User.bind("change", function(){
  22. var template = $("#userTmpl").tmpl(User.records);
  23. $("#users").empty();
  24. $("#users").append(template);
  25. });
  26. User.create("First one");
  27. setTimeout(function(){
  28. User.create("Another one");
  29. }, 2000);
  30. });
  31. </script>
  32. </head>
  33. <body>
  34. <script id="userTmpl" type="text/x-jquery-tmpl">
  35. <li>${name}</li>
  36. </script>
  37. <ul id="users">
  38. </ul>
  39. </body>

mvc-5视图和模版的更多相关文章

  1. Asp.net MVC Razor视图模版动态渲染PDF,Razor模版生成静态Html

    Asp.net MVC Razor视图模版动态渲染PDF,Razor模版生成静态Html 1.前言 上一篇文章我开源了轮子,Asp.net Core 3.1 Razor视图模版动态渲染PDF,然后,很 ...

  2. ASP.NET MVC 5 - 视图

    在本节中,你要去修改HelloWorldController类,使用视图模板文件,在干净利索地封装的过程中:客户端浏览器生成HTML. 您将创建一个视图模板文件,其中使用了ASP.NET MVC 3所 ...

  3. ASP.NET Mvc Razor视图语法

    在ASP.NET MVC中有两套模版引擎,一套是ASPX,一套是Razor,从事过WebForms开发的朋友们,对于ASPX模版已经很熟悉了,下面我说一下我所熟悉的Razor模版引擎的一些语法,供大家 ...

  4. [转]ASP.NET MVC 5 - 视图

    在本节中,你要去修改HelloWorldController类,使用视图模板文件,在干净利索地封装的过程中:客户端浏览器生成HTML. 您将创建一个视图模板文件,其中使用了ASP.NET MVC 3所 ...

  5. ASP.NET MVC——Razor视图引擎

    Razor是MVC框架视图引擎,我们今天就来说一说Razor视图引擎. 首先还是来创建一个基础项目叫Razor来演示. 先来定义一个Model叫Product public class Product ...

  6. 体验 ASP.NET Core 1.1 中预编译 MVC Razor 视图

    这是从 ASP.NET Core 1.1 官方发布博文中学到的一招,可以在 dontet publish 时将 Razor 视图编译为 .dll 文件. 需要在 project.json 中添加如下配 ...

  7. asp.net mvc 部分视图加载区别

    ASP.NET MVC 部分视图   ASP.NET(11)  版权声明:本文为博主原创文章,未经博主允许不得转载. [部分视图] ASP.NET MVC 里的部分视图,相当于 Web Form 里的 ...

  8. MVC中视图View向控制器传值的方法

    MVC中视图View向控制器传值的方法步骤如下: 1.index页面: 页面中只需要一个触发事件的按钮

  9. mvc的视图中显示DataTable的方法

    mvc的视图中显示DataTable的方法: 不断的循环画出table @{ ViewBag.Title = "ShowDataTable"; } @using System.Da ...

  10. 乡下人重拾MVC——创建视图

    1. 创建视图都不勾选:代表不使用任何模版,页面的代码即为运行后显示的内容 2.  创建分部视图 代表统会自动把View文件夹下名为“_ViewStart.cshtml”的内容添加到新建的html最上 ...

随机推荐

  1. iOS开发之#iPhone6与iPhone6Plus适配#Xcode6.0/Xcode6.1上传应用过程中一些变动以及#解决方案#

    更新时间2014年11月13日  本博文创建时,只有Xcode6.0, Xcode6.0尝试多次,确实如此 之后在6.1版本经博主少量尝试,确实也有如下问题,现更新下博客! iOS8发布之后,苹果强制 ...

  2. 一个Java对象到底占用多大内存?

    最近在读<深入理解Java虚拟机>,对Java对象的内存布局有了进一步的认识,于是脑子里自然而然就有一个很普通的问题,就是一个Java对象到底占用多大内存? 在网上搜到了一篇博客讲的非常好 ...

  3. [Effective JavaScript 笔记]第27条:使用闭包而不是字符串来封装代码

    函数是一种将代码作为数据结构存储的便利方式,代码之后可以被执行.这使得富有表现力的高阶函数抽象如map和forEach成为可能.它也是js异步I/O方法的核心.与此同时,也可以将代码表示为字符串的形式 ...

  4. Xcode 5.0.2 下载地址

    下载地址:http://adcdownload.apple.com/Developer_Tools/xcode_5.0.2/xcode_5.0.2.dmg command_line_tools_os_ ...

  5. 用poi框架进行批量导入导出实例

    Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程式对Microsoft Office格式档案读和写的功能.我们这里使用poi对数据库中的数据进行批量导出,以及 ...

  6. 序列化.to_sym

    <%= link_to t('links.list'), showable_paths[@subchannel_item.showable_type.to_sym], target: '_bla ...

  7. 【Django】Django 如何支持 分组查询、统计?

    代码: from django.db.models import Sum alarm_sum_group_items = models.FILE_PROTECT_ALARM.objects.filte ...

  8. Android Volley获取json格式的数据

    为了让Android能够快速地访问网络和解析通用的数据格式Google专门推出了Volley库,用于Android系统的网络传输.volley库可以方便地获取远程服务器的图片.字符串.json对象和j ...

  9. extjs在窗体中添加搜索框

    在extjs中添加搜索框,搜索框代码如下: this.searchField = new Ext.ux.form.SearchField({            store : this.store ...

  10. ios获取一个文件夹下的文件(夹)列表

    NSArray* ary=[[NSFileManager defaultManager] contentsOfDirectoryAtPath:[[NSBundle mainBundle] pathFo ...