动态渲染视图

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

模版

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

<script type="text/javascript">
var object = {
url: "https://www.google.com/",
getName: function () {
return "testName";
}
};
var tmpl = '<li><a href="${url}">${getName()}</a></li>';
var elem = jQuery.tmpl(tmpl, object);
$("body").append(elem);
</script>
//
<script id="tmpl" type="text/template">
<li><a href="${url}">${getName()}</a></li>
</script>
<script type="text/javascript">
var object = {
url: "https://www.google.com/",
getName: function () {
return "testName";
}
};
var elem = $("#tmpl").tmpl(object);
elem.appendTo($("body"));
</script>
  • 一些高级功能
<script type="text/template" id="tmpl">
{{if url}}
${url}
{{/if}} {{if messages.length}}
<ul>
{{each messages}}
<li>${$index + 1}: <em>${$value}</em></li>
{{/each}}
{{else}}
no messages
{{/if}}
</script>
<script type="text/javascript">
var object = {
url: "https://www.google.com/",
messages: ['one', 'two']
};
var elem = $("#tmpl").tmpl(object);
$("body").append(elem);
</script>

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

模版helper

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

//替换一段纯文本中的<a></a>标签里的链接

<script type="text/tamplate" id="tmpl">
${helper.autoLink(this.data)} //这里data指代tmpl()方法传入的数据;
</script>
<script type="text/javascript">
var helper = {};
helper.autoLink = function(data) {
var re = /((http|https|ftp):\/\/[\w?=&.\/-;#~%-]+(?![\w\s?&.\/;#~%"=-]*>]))/g;
console.log(data);
return (data.replace(re, '<a target="_blank" href="$1">$1</a>'));
};
var elem = $("#tmpl").tmpl("https://github.com/maccman/jquery.tmpl");
$("body").append(elem);
</script>

模版存储

包括

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

绑定

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

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

  var addChange = function (ob) {
ob.change = function(cb) {
if(cb) {
if(!this._change) this._change = [];
this._change.push(cb);
} else {
if(!this._change) return;
for(var i = 0, len = this._change.length; i < len; i++) {
this._change[i].apply(this);
}
}
}
} var object = {};
object.name = 'Foo'; addChange(object);
object.change(function() {
console.log("Changed!", this);
//添加更新视图的代码
}); object.change();
object.name = "Bar";
object.change();

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

模型中的事件绑定

<script type="text/javascript" charset="utf-8">
var User = function(name){
this.name = name;
};
User.records = []
User.bind = function(ev, callback) {
var calls = this._callbacks || (this._callbacks = {});
(this._callbacks[ev] || (this._callbacks[ev] = [])).push(callback);
};
User.trigger = function(ev) {
var list, calls, i, l;
if (!(calls = this._callbacks)) return this;
if (!(list = this._callbacks[ev])) return this;
jQuery.each(list, function(){ this() })
}; User.create = function(name){
this.records.push(new this(name));
this.trigger("change")
};
jQuery(function($){
User.bind("change", function(){
var template = $("#userTmpl").tmpl(User.records); $("#users").empty();
$("#users").append(template);
}); User.create("First one"); setTimeout(function(){
User.create("Another one");
}, 2000);
});
</script>
</head> <body>
<script id="userTmpl" type="text/x-jquery-tmpl">
<li>${name}</li>
</script> <ul id="users">
</ul>
</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. Socket 多线程FTP软件开发

    Socket具体还可见360云中文档记载 Socket是一个非常古老的协议了 1970年 Socket.AF_Unix======AF意思是  addressFamily 地址簇 Import os ...

  2. Linux下使用fdisk扩展分区容量

    导读 我们管理的服务器可能会随着业务量的不断增长造成磁盘空间不足的情况,比如:共享文件服务器硬盘空间不足,在这个时候我们就需要增加磁盘空间,来满足线上的业务:又或者我们在使用linux的过程中, 有时 ...

  3. Difference between git pull and git pull --rebase

    个人博客地址:  http://www.iwangzheng.com/ 推荐一本非常好的书 :<Pro Git>  http://iissnan.com/progit/ 构造干净的 Git ...

  4. [UOJ#34]多项式乘法

    [UOJ#34]多项式乘法 试题描述 这是一道模板题. 给你两个多项式,请输出乘起来后的多项式. 输入 第一行两个整数 n 和 m,分别表示两个多项式的次数. 第二行 n+1 个整数,分别表示第一个多 ...

  5. 正则匹配之url的匹配

    通过这几天的学习,已经对正则有所了解了. 下面动手写一个匹配url的正则吧. <?php $str="http://www.baidu.com"; $reg="/( ...

  6. RPM常用组合【转载】

    RPM常用组合 -ivh:安装显示安装进度--install--verbose--hash -Uvh:升级软件包--Update: -qpl:列出RPM软件包内的文件信息[Query Package ...

  7. Linux 高可用开源方案 Keepalived VS Heartbeat对比

    1)Keepalived使用更简单:从安装.配置.使用.维护等角度上对比,Keepalived都比Heartbeat要简单得多,尤其是Heartbeat2.1.4后拆分成3个子项目,安装.配置.使用都 ...

  8. iptables 命令介绍

    http://www.cnblogs.com/wangkangluo1/archive/2012/04/19/2457072.html iptables 防火墙可以用于创建过滤(filter)与NAT ...

  9. fsck检查和修复文件系统

    重视:fsck不能乱用.先要把文件系统umount掉,然后检查.最好启动到单用户模式下fsck. 常见的5种损坏类型 1 未被引用的inode 2 难以置信的超大链接数 3 没有记录在磁盘块映射表中的 ...

  10. CSS本页写样式

    <style type="text/css">p{ color:#ff0000; font-size:24px; font-family:"隶书"; ...