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最上 ...
随机推荐
- IOS: 使用imageIO获取和修改图片的exif信息
使用imageIO获取和修改图片的exif信息 一幅图片除了包含我们能看见的像素信息,背后还包含了拍摄时间,光圈大小,曝光等信息.UIImage类将这些细节信息都隐藏了起来,只提供我们关心的图片尺寸, ...
- dedecms如何自定义专题模板
很多人看到别人的网站也是用dedecms建的,但是他们的专题做得很漂亮,也在想如何自定义dedecms专题模板呢? 其实很简单,只要在dedecms默认专题模板上做一些修改就好了 <!DOCTY ...
- dedecms发布文章时多个Tag间分割逗号自动变成英文逗号
dedecms发布文章时经常会添加多个Tag,我们输入汉字时总是喜欢使用全角的逗号,那么有没有办法使用JS脚本把输入的Tag间中文逗号变成英文逗号呢? dedecms发布文章时多个Tag间分割逗号自动 ...
- show processlist 其中status详解(适用于所有概况)
mysql show processlist分析 2011-04-11 16:13:00 分类: Mysql/postgreSQL mysql> show processlist; +—–+—— ...
- HNU 12847 Dwarf Tower(最短路+队列优化)
题目链接:http://acm.hnu.cn/online/?action=problem&type=show&id=12847 解题报告:有n样物品,编号从1到n第i样物品可以通过金 ...
- hiho一下 第九十五周 数论四·扩展欧几里德
题目 : 数论四·扩展欧几里德 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho周末在公园溜达.公园有一堆围成环形的石板,小Hi和小Ho分别站在不同的石板上 ...
- 响应式Web设计(Responsive Web design)
中文名 响应式Web设计 提出时间 2010年5月 英 文 Responsive Web design 解 释 一个网站能够兼容多个终端 目 的 解决移动互联网的浏览 优 点 ...
- Find Leaves of Binary Tree
Given a binary tree, collect a tree's nodes as if you were doing this: Collect and remove all leaves ...
- 【leetcode】3Sum Closest
3Sum Closest Given an array S of n integers, find three integers in S such that the sum is closest t ...
- iOS 利用constraint实现2个控件上下的空白是相等的
说的有点乱,先看个图把 其实这个constrant的目的就是控制两个方形的控件上方和下方的空白大小. 对于每一个方块来说,他们上方和下方的空白是相同的.这种“居中”的设计到处可见.一个控件想实现这种居 ...