访问视图

常见地视图模式时一个视图对应一个控制器,视图包含一个id,通过id传入控制器;在视图之中的元素则使用class

这里会使用jquery的选择器,为了减少使用,可以设置一个专门用于存放选择器到变量的映射表

<div id="users">
<form>
<input type="search" value="" placeholder="Enter a query">
<button type="button">Search</button>
</form>
</div> jQuery(function($) {
exports.SearchView = Controller.create({
//选择器局部变量名地映射
elements: {
"input[type=search]": "searchInput",
"form": "searchForm"
},
//实例化时调用
init: function(elem) {
this.el = $(elem);
this.refreshElements();
this.searchForm.submit(this.proxy(this.search));
},
search: function() {
console.log("Searching:", this.searchInput.val());
},
//私有
$: function(selector) {
//需要一个el属性,同时传入选择器
return $(selector, this.el);
},
//设置本地变量
refreshElements: function() {
for(var key in this.elements) {
this[this.elements[key]] = this.$(key);
}
}
});
new SearchView("#users");
});

委托事件

通过设置一个events对象代理,进行事件的委托和移除

jQuery(function($){
exports.SearchView = Controller.create({
//所有事件名称,选择器和回调的映射
events: {
"submit form": "search"
},
init: function(element){
//.....
this.delegateEvents();
},
search: function(){
//...
},
//根据第一个空格分割
eventSplitter: /^(\w+)\s*(.*)$/, delegateEvents: function(){
for (var key in this.events) {
var methodName = this.events[key];
var method = this.proxy(this[methodName]);
var match = key.match(this.eventSplitter);
var eventName = match[1], selector = match[2];
if (selector === '') {
this.el.bind(eventName, method);
} else {
this.el.delegate(selector, eventName, method);
}
}
}
});
new SearchView("#users");
});

状态机

  • 作用:管理多控制器,根据需要显示和隐藏视图

  • 组成: 状态和转换器; 它包含一个活动状态和许多非活动状态;

  var Events = {
bind: function() {
this.o = this.o || $({});
this.o.bind.apply(this.o ,arguments);
},
trigger: function() {
this.o = this.o || $({});
this.o.trigger.apply(this.o, arguments);
}
} var StateManchine = function() {};
StateManchine.fn =StateManchine.prototype;
//添加事件绑定或触发行为
$.extend(StateManchine.fn, Events);
//这个add函数将传入的控制器添加至状态列表并创建一个active函数;当调用active的时候,控制器状态转化为激活状态,对于激活状态的控制器,状态将基于它调用activate,对于其他控制器,状态机会调用deactivate;
StateManchine.fn.add = function(controller) {
this.bind("change", function(e, current) {
if(controller == current)
controller.activate();
else
controller.deactivate();
});
controller.active = $.proxy(function() {
this.trigger("change", controller);
}, this);
}; //使用
var con1 = {
activate: function() {
$("#con1").addClass("active");
},
deactivate: function() {
$("#con1").removeClass("active");
}
};
var con2 = {
activate: function() {
$("#con2").addClass("active");
},
deactivate: function() {
$("#con2").removeClass("active");
}
};
//创建状态机并添加状态
var sm = new StateManchine;
sm.add(con1);
sm.add(con2); //会触发con1.activate;con2.deactivate;
con1.active(); //会触发con2.activate;con1.deactivate;
sm.trigger("change", con2);

路由选择

由于应用是单页面的,URL一般不会变;当考虑到具体情况,需要对其进行改变

使用URL中的hash####

改变URL会造成页面刷新;操作URL的一种办法是改变hash值,因为hash不会发送给服务器,改变其不会造成刷新

//设置
window.location.hash = "foo";
//去掉#
var hashValue = window.location.hash.slice(1);

注意要限制这种改动的次数,过多的设置hash会影响性能,特别是在移动端,可能会造成页面频繁滚动

检测hash的变化####

监听

window.addEventListener('hashchange', function(event){});
  • 设置location.hash或修改hash后重新载入时触发;

mvc-4控制器和状态(2)的更多相关文章

  1. Javascript MVC 学习笔记(二) 控制器和状态

    今天进入第二个部分:控制器. 控制器和状态 从以往的开发经验来看.我们都是将状态保存在server的session或者本地cookie中,但Javascript应用往往被限制在单页面,所以我们也能够将 ...

  2. ASP.NET MVC 5 - 控制器

    MVC代表: 模型-视图-控制器 .MVC是一个架构良好并且易于测试和易于维护的开发模式.基于MVC模式的应用程序包含: · Models: 表示该应用程序的数据并使用验证逻辑来强制实施业务规则的数据 ...

  3. .NET/ASP.NET MVC Controller 控制器(IController控制器的创建过程)

    阅读目录: 1.开篇介绍 2.ASP.NETMVC IControllerFactory 控制器工厂接口 3.ASP.NETMVC DefaultControllerFactory 默认控制器工厂 4 ...

  4. MVC 在控制器中获取某个视图动态的HTML代码

    ASP.NET MVC 在控制器中获取某个视图动态的HTML代码   如果我们需要动态的用AJAX从服务器端获取HTML代码,拼接字符串是一种不好的方式,所以我们将HTML代码写在cshtml文件中, ...

  5. 三、ASP.NET MVC Controller 控制器(二:IController控制器的创建过程)

    阅读目录: 1.开篇介绍 2.ASP.NETMVC IControllerFactory 控制器工厂接口 3.ASP.NETMVC DefaultControllerFactory 默认控制器工厂 4 ...

  6. c#异步编程(三)—ASP.NET MVC 异步控制器及EF异步操作

    ASP.NET MVC 异步控制器及EF异步操作 异步控制器 ASP.NET MVC2后开始了对异步请求管道的支持,异步请求管道的作用是允许web服务器处理长时间运行的请求,比如 那些花费大量时间等待 ...

  7. [转]ASP.NET MVC 5 - 控制器

    MVC代表: 模型-视图-控制器 .MVC是一个架构良好并且易于测试和易于维护的开发模式.基于MVC模式的应用程序包含: · Models: 表示该应用程序的数据并使用验证逻辑来强制实施业务规则的数据 ...

  8. Spring MVC(三)--控制器接受普通请求参数

    Spring MVC中控制器接受参数的类方式有以下几种: 普通参数:只要保证前端参数名称和传入控制器的参数名称一致即可,适合参数较少的情况: pojo类型:如果前端传的是一个pojo对象,只要保证参数 ...

  9. ASP.NET MVC系列:控制器的Edit方法

    在前面我们已经介绍了如何创建控制器.视图和数据模型,运行之前的项目并打开Movies主页,将鼠标悬停在“编辑”菜单上,你会看到浏览器右下角显示了“编辑”链接的地址

随机推荐

  1. Sqlserver日期函数应用

    1.获取当前时间 SELECT  GETDATE() AS '当前日期' ,         DATENAME(year, GETDATE()) AS '年' ,         DATENAME(m ...

  2. java笔记--使用SwingWoker类完成耗时操作

    使用SwingWoker类完成耗时操作: 对于Swing中的耗时操作,通常要在一个新的线程中运行,以免程序"假死". 在java6.0中,可以用SwingWoker类来完成 Swi ...

  3. 在link的url里新增参数

    (文章都是从我的个人主页上粘贴过来的,大家也可以访问我的主页 www.iwangzheng.com) <%= link_to image_tag("/images/icons/aaa. ...

  4. (转)女生应该找一个玩ACM的男生

    1.强烈的事业心 将来,他也一定会有自己热爱的事业.而且,男人最性感的时刻之一,就是他专心致志做事的时候.所以,找一个机会在他全神贯注玩ACM的时候,从侧面好好观察他,你就会发现我说的话没错. 2.永 ...

  5. C++中new的解说

    new int;//开辟一个存放整数的存储空间,返回一个指向该存储空间的地址(即指针) new int(100);//开辟一个存放整数的空间,并指定该整数的初值为100,返回一个指向该存储空间的地址 ...

  6. linux 下查看某个端口是否被占用

    lsof -i:端口号 转自: http://my.oschina.net/u/193184/blog/146885

  7. 44. log(n)求a的n次方[power(a,n)]

    [题目] 实现函数double Power(double base, int exponent),求base的exponent次方,不需要考虑溢出. [分析] 这是一道看起来很简单的问题,很容易写出如 ...

  8. (转)SQL Server 中WITH (NOLOCK)浅析

    概念介绍 开发人员喜欢在SQL脚本中使用WITH(NOLOCK), WITH(NOLOCK)其实是表提示(table_hint)中的一种.它等同于 READUNCOMMITTED . 具体的功能作用如 ...

  9. POJ 2549 Sumsets hash值及下标

    题目大意:找到几何中的4个数字使他们能够组成 a+b+c=d , 得到最大的d值 我们很容易想到a+b = d-c 那么将所有a+b的值存入hash表中,然后查找能否在表中找到这样的d-c的值即可 因 ...

  10. mybatis中的oracle和mysql分页

    这段时间一直在用mybatis+spring+springMVC的框架,总结点东西吧. mybatis的oracle分页写法: <?xml version="1.0" enc ...