mvc-5视图和模版
动态渲染视图
- 当待渲染的视图内容不多的时候,可以将视图元素放在控制器或者状态里
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视图和模版的更多相关文章
- Asp.net MVC Razor视图模版动态渲染PDF,Razor模版生成静态Html
Asp.net MVC Razor视图模版动态渲染PDF,Razor模版生成静态Html 1.前言 上一篇文章我开源了轮子,Asp.net Core 3.1 Razor视图模版动态渲染PDF,然后,很 ...
- ASP.NET MVC 5 - 视图
在本节中,你要去修改HelloWorldController类,使用视图模板文件,在干净利索地封装的过程中:客户端浏览器生成HTML. 您将创建一个视图模板文件,其中使用了ASP.NET MVC 3所 ...
- ASP.NET Mvc Razor视图语法
在ASP.NET MVC中有两套模版引擎,一套是ASPX,一套是Razor,从事过WebForms开发的朋友们,对于ASPX模版已经很熟悉了,下面我说一下我所熟悉的Razor模版引擎的一些语法,供大家 ...
- [转]ASP.NET MVC 5 - 视图
在本节中,你要去修改HelloWorldController类,使用视图模板文件,在干净利索地封装的过程中:客户端浏览器生成HTML. 您将创建一个视图模板文件,其中使用了ASP.NET MVC 3所 ...
- ASP.NET MVC——Razor视图引擎
Razor是MVC框架视图引擎,我们今天就来说一说Razor视图引擎. 首先还是来创建一个基础项目叫Razor来演示. 先来定义一个Model叫Product public class Product ...
- 体验 ASP.NET Core 1.1 中预编译 MVC Razor 视图
这是从 ASP.NET Core 1.1 官方发布博文中学到的一招,可以在 dontet publish 时将 Razor 视图编译为 .dll 文件. 需要在 project.json 中添加如下配 ...
- asp.net mvc 部分视图加载区别
ASP.NET MVC 部分视图 ASP.NET(11) 版权声明:本文为博主原创文章,未经博主允许不得转载. [部分视图] ASP.NET MVC 里的部分视图,相当于 Web Form 里的 ...
- MVC中视图View向控制器传值的方法
MVC中视图View向控制器传值的方法步骤如下: 1.index页面: 页面中只需要一个触发事件的按钮
- mvc的视图中显示DataTable的方法
mvc的视图中显示DataTable的方法: 不断的循环画出table @{ ViewBag.Title = "ShowDataTable"; } @using System.Da ...
- 乡下人重拾MVC——创建视图
1. 创建视图都不勾选:代表不使用任何模版,页面的代码即为运行后显示的内容 2. 创建分部视图 代表统会自动把View文件夹下名为“_ViewStart.cshtml”的内容添加到新建的html最上 ...
随机推荐
- Stream探究
http://segmentfault.com/a/1190000003479884 1. 认识Stream Stream的概念最早来源于Unix系统,其可以将一个大型系统拆分成一些小的组件,然后将这 ...
- javascript判断上传文件大小
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- CMS介绍
CMS介绍 CMS是Content Management System的缩写,意为“内容管理系统”,它具有许多基于模板的优秀设计,可以加快网站开发的速度和减少开发的成本. CMS的功能不仅限于处理文本 ...
- 2014-08-07 SSDB 使用 rocksdb 引擎
http://www.ideawu.net/blog/archives/824.html 为了满足各位对 Facebook 出品的 rocksdb 的爱好, SSDB 数据库也可以使用 rocksdb ...
- mysql中binary相加的问题
我在mysql中有这样一段代码 SQL code ? 1 2 3 4 5 6 7 8 declare @byte1 binary(1) declare @byte2 binary(1) decla ...
- 编译 uImage
编译 uImage 和测试 u-Boot - 小猪爱拱地 - 博客频道 - CSDN.NET http://blog.csdn.net/caspiansea/article/details/38057 ...
- Dom lesson1
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 【转】windows下安装和调用curl的方法
本文转自:http://1316478764.iteye.com/blog/2100778 curl是利用URL语法在命令行方式下工作的开源文件传输工具.它支持很多协议:FTP, FTPS, HTTP ...
- linux 多个文件中查找字符串
2015年2月9日 14:36:38 # find <directory> -type f -name "*.c" | xargs grep "<str ...
- 转mysql复制主从集群搭建
最近搭了个主从复制,中间出了点小问题,排查搞定,记录下来 1环境:虚拟机:OS:centos6.5Linux host2 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 ...