AngularJs MVC 详解
- 为什么在前端也需要MVC
1、代码规模越来越大,切分职责是大势所趋
2、为了复用
3、为了后期维护方便
MVC的目的是为了模块化和复用
- 前端实现MVC的困难
1、操作DOM必须等整个页面加载完
2、多个js如果出现依赖,需要程序员自己解决
3、js的原型继承
- Controller
需求:有一些功能,在各个控制器中都会用到,怎么办?
<!DOCTYPE html>
<html lang="en" ng-app="myApp">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript" src="../../jslib/angular.min-1.5.8.js"></script>
<script type="text/javascript" src="demo02.js"></script>
</head>
<body>
<div ng-controller="CommonController">
<div ng-controller="Controller1">
<p>{{greet.text}},AngularJs</p>
<button ng-click="test1()">test1</button>
</div>
<div ng-controller="Controller2">
<p>{{greet.text}},AngularJs</p>
<button ng-click="test2()">test2</button>
</div>
<button ng-click="commonFn()">通用</button>
</div>
</body>
</html>
demo02.html
/**
* Created by sherry on 16/8/3.
*/ var myApp = angular.module("myApp",[]);
myApp.controller("CommonController",function ($scope) {
$scope.commonFn = function () {
alert("这是通用功能");
}
});
myApp.controller("Controller1",function ($scope) {
$scope.greet = {
text:"Hello1"
};
$scope.test1 = function () {
alert("test1");
}
});
myApp.controller("Controller2",function ($scope) {
$scope.greet = {
text:"Hello2"
};
$scope.test2 = function () {
alert("test2");
}
});
demo02.js
对于button,不管其隶属于哪个控制器,只要是在 CommonController 内的,就都能被调用 commonFn 方法就变成了两个“子”控制器的公共方法
如下:
<div ng-controller="CommonController">
<div ng-controller="Controller1">
<p>{{greet.text}},AngularJs</p>
<button ng-click="test1()">test1</button>
</div>
<div ng-controller="Controller2">
<p>{{greet.text}},AngularJs</p>
<button ng-click="test2()">test2</button>
<button ng-click="commonFn()">通用</button>
</div>
</div>
但是:AngularJs中并不推荐这么做,AngularJs的最佳实践,是把公共部分抽取成Service,被Controller调用
Controller使用中的注意点:
1、不要试图去复用Controller,一般控制器只负责一小块视图【一般一个Controller负责的是一个业务逻辑,除非业务逻辑切分得足够细,否则不具备复用的可能】
2、不要在Controller中操作DOM,这不是控制器的职责【推荐将DOM操作使用指令来做,Controller中操作DOM的速度是非常低的】
3、不要在Controller里面做数据格式化,AngularJs有很好的表单控件
4、不要在Controller里面做数据过滤操作,AngularJs有$filter服务
5、一般来说,Controller是不会相互调用的,控制器之间的交互通过事件进行
- Model
<!DOCTYPE html>
<html lang="en" ng-app>
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript" src="../../jslib/angular.min-1.5.8.js"></script>
</head>
<body>
<input type="text" placeholder="输入..." ng-model="name">
<p>{{name}}</p>
</body>
</html>
通过 ng-model 标签,定义一个数据模型,实现双向绑定
- View
利用 driective 实现View的复用,就是定义一个指令,设置一个模板
AngularJs中的MVC,是借助$scope(作用域)实现的
- AngularJs作用域
$rootScope,根作用域,如果属性在当前控制器的$scope中找不到,就会依次向上去寻找,这点很像JavaScript中的原型继承
$scope是一个POJO
$scope提供了一些工具方法 $watch/$apply
$scope是表达式的执行环境
$scope是一个树型结构,与DOM标签平行
子$scope会继承父$scope上的属性和方法
每个AngularJs只有一个根$scope对象(一般位于ng-app上)
$scope可以传播事件,类似DOM事件,可以向上或向下传播
$scope不仅仅是MVC的基础,也是数据双向绑定的基础
使用 angular.element($0).scope() 获取当前$scope进行调试
AngularJs MVC 详解的更多相关文章
- MVC详解(转)
原文链接:MVC详解 MVC与模板概念的理解 MVC(Model View Controller)模型-视图-控制器 MVC本来是存在于Deskt op程序中的,M是指数据模型,V是指用户界面,C ...
- Spring MVC 详解之废话少说
<陈翔六点半之废话少说>.... Spring WEB MVC 的请求流程: Spring WEB MVC架构: 开始创建.配置gradle项目 1.在gralde项目中,选择SDK 和框 ...
- AWS MVC 详解
由于新工作是在AWS PaaS平台上进行开发,为不耽误工作,先整理一下AWS MVS的使用规范,快速上手.对AWS PaaS平台的相关介绍留到以后再来补充.本文几乎是对官方学习文档的整理,有遗漏的后补 ...
- angularjs filter 详解
系统的学习了一下angularjs,发现angularjs的有些思想根php的模块smarty很像,例如数据绑定,filter.如果对smarty比较熟悉的话,学习angularjs会比较容易一点.这 ...
- iOS开发——MVC详解&Swift+OC
MVC 设计模式 这两天认真研究了一下MVC设计模式,在iOS开发中这个算是重点中的重点了,如果对MVC模式不理解或者说不会用,那么你iOS肯定学不好,或者写不出好的东西,当然本人目前也在学习中,不过 ...
- angularjs 指令详解 - template, restrict, replace
通过指令机制,angularjs 提供了一个强大的扩展系统,我们可以通过自定义指令来扩展自己的指令系统. 怎样定义自己的指令呢? 我们通过 Bootstrap UI来学习吧.这个项目使用 angula ...
- Java中MVC详解以及优缺点总结
概念: MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务数据.逻辑.界面显示分离的 ...
- AngularJS Providers 详解
供应者(Providers) Each web application you build is composed of objects that collaborate to get stuff d ...
- AngularJS开发指南5:AngularJS表达式详解
AngularJS表达式类似Javascript的代码片段,通常在数据绑定中用到,写在双大括号中,如:{{表达式}}.表达式是用$parse方法来处理的. 下面是一些合法的AngularJS表达式 1 ...
随机推荐
- Java反射得到属性的值和设置属性的值
package com.whbs.bean; public class UserBean { private Integer id; private int age; private String n ...
- windows下安装python的包管理工具pip,scikit-learn
打开https://pip.pypa.io/en/latest/installing.html#python-os-support 下载pip-get.py 进入python,执行pip-get.py ...
- 【算法】Fibonacci(斐波那契数列)相关问题
一.列出Fibonacci数列的前N个数 using System; using System.Collections.Generic; using System.Linq; using System ...
- Dtree 添加 checkbox 复选框 可以默认选中
一:目标 要实现用一个树形结构的展示数据,每个节点(除了根节点)前有一个checkbox,同时,点击父节点,则子节点全选或者全不选,当选中了全部子节点,父节点选中:如下图所示: 同时可以在创建的时候, ...
- PAT 乙级 1024
题目 题目地址:PAT 乙级 1024 题解 模拟题,重点需要考虑到各种不同情况:简单来说一下: 因为输入格式固定,所以把不同的部分分别存储和处理可以在很大程度上简化运算:其中需要考虑最多的就是小数部 ...
- Centos7之Nginx
1.安装 下载RPM: wget http://nginx.org/download/nginx-1.16.0.tar.gz 解压:tar -zxf nginx-1.16.0.tar.gz 安装: c ...
- 分享自己写的基于Dapper的轻量级ORM框架~
1.说明 本项目是一个使用.NET Standard 2.0开发的,基于 Dapper 的轻量级 ORM 框架,包含基本的CRUD以及根据表达式进行一些操作的方法,目前只针对单表,不包含多表连接操作. ...
- 09.VUE学习之watch监听属性变化实现类百度搜索栏功能ajax异步请求数据,返回字符串
cmd下安装axios npm install axios 安装好后,会多出node_modules文件夹 思路: 监听data里的word改变时,发送ajax异步请求数据, 把返回的数据赋值给dat ...
- Visual Studio的下载安装
下载地址: 下载Visual Studio Code https://code.visualstudio.com/ 安装扩展包 安装图标 View->Extensions 搜索Icon 安装Ma ...
- 第11课 文章分类(组件化开发) Thinkphp5商城第四季
目录 思路: 控制器里 扩展类里: 视图层: 思路: 控制器查出所有数据后调用扩展类里的无限级分类 public function catetree($cateRes) 方法. 把排序好的数据传给视图 ...