动态渲染视图

  • 当待渲染的视图内容不多的时候,可以将视图元素放在控制器或者状态里
  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. this prototype 闭包 总结

    this对象 整理下思路: 一般用到this中的情景: 1.构造方法中 function A(){ this.name="yinshen"; } var a=new A(); co ...

  2. Math.Round函数详解

    有不少人误将Math.Round函数当作四舍五入函数在处理, 结果往往不正确, 实际上Math.Round采用的是国际通行的是 Banker 舍入法. Banker's rounding(银行家舍入) ...

  3. [Effective JavaScript 笔记]第6章:库和API设计--个人总结

    前言 又到了一章的总结,这章里的内容.是把我从一个代码的使用者,如何换位成一个代码的编写者.如何让别人用自己的代码更容易,不用去注意太多的无用细节,不用记住冗长的函数名.在使用API时怎样避免使用者会 ...

  4. [Effective JavaScript 笔记]第57条:使用结构类型设计灵活的接口

    想象创建wiki的库.wiki网站包含用户可以交互式地创建.删除和修改的内容.许多wiki都以简单.基于文本标记语言创建内容为特色.通常,这些标记语言只提供了HTML可用功能的一个子集,但是却有一个更 ...

  5. 将Web应用性能提高十倍的10条建议

    导读 提高 web 应用的性能从来没有比现在更重要过.网络经济的比重一直在增长:全球经济超过 5% 的价值是在因特网上产生的(数据参见下面的资料).这个时刻在线的超连接世界意味着用户对其的期望值也处于 ...

  6. HDU 1875 畅通工程再续 (prim最小生成树)

    B - 畅通工程再续 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit S ...

  7. Python 命令详解

    1. 新建一个 django-project django-admin.py startproject project-name 一个 project 一般为一个项目 2. 新建 app python ...

  8. XPath 定位----光荣之路

    被测试网页的HMTL代码 <html> <body> <div id="div1"> <input name="div1inpu ...

  9. 1.前端笔记之html

    title: 1.前端笔记之HTML date: 2016-04-04 23:21:52 tags: Python categories: Python --- 作者:刘耀 **出处:http://w ...

  10. Sass 中的 @ 规则

    一. @import Sass 扩展了 CSS 的 @import 规则,让它能够引入 SCSS 和 Sass 文件. 所有引入的 SCSS 和 Sass 文件都会被合并并输出一个单一的 CSS 文件 ...