最近在用angularjs做一些东西,由于学艺不精,对angularjs了解不够,导致经常会不小心掉进一些自己挖的坑里(⊙_⊙),在这里记下来,谨防又踩。

1、angularjs ng-show not working

在页面中用到了pagination 分页插件

<pagination total-items="bigTotalItems" page="bigCurrentPage" max-size="maxSize" class="pagination-small" boundary-links="true"></pagination> 

。就想说总的条目数bigTotalItems为0的时候就不显示插件了,ng-show="!!bigTotalItems"。结果ng-show怎么都不起作用。但是如果直接写ng-show="!!0" 、ng-show="!!80"又是有效的。。。。

然后我又想换一种写法,在controller里面写个方法。

$scope.isShow = function{
return !!$scope.bigTotalItems;
};
<pagination ng-show="isShow()" total-items="bigTotalItems" page="bigCurrentPage" max-size="maxSize" class="pagination-small" boundary-links="true"></pagination>

还是没效果,这个时候有点明白了,是scope的问题。于是换一种写法再试一下:

<div ng-show="!!bigTotalItems">
<pagination total-items="bigTotalItems" page="bigCurrentPage" max-size="maxSize" class="pagination-small" boundary-links="true"></pagination>
</div>

果然这个时候就可以了。

pagination指令编写的时候

.directive('pagination', ['$parse', 'paginationConfig', function($parse, config) {
return {
restrict: 'EA',
scope: {
page: '=',
totalItems: '=',
onSelectPage:' &'
},
controller: 'PaginationController',
......

scope的设置为 {},, 这时 directive 创建一个独立的 scope,没有原型继承,directive 不会不小心读写父 scope。

所以当我把ng-show="!!bigTotalItems"写在指令pagination里的时候,pagination已经拥有了一个独立的scope,是无法读到父scope里面的bigTotalItems的了。

关于angularjs的scope,这里有篇文章写得很详细深入理解 AngularJS 的 Scope

2、scope.$apply

遇到了一个数据双向绑定失效的问题,就是明明在controller里面给$scope.×××赋值了,在页面上愣是没有update数据。

一开始还不知道是啥原因,然后上网找解决办法的时候看到说在后面加一句$scope.$apply()就行了,试了一下真的可以,这才发现有$scope.$apply()这个东西。

但是为什么加了$scope.$apply()就可以了?什么时候要用到$scope.$apply()?

上网搜了一下看到这篇文章,解决了我的疑问AngularJS and scope.$apply

$scope.$apply的作用的用来手动通知页面update绑定的数据的。

一般情况下是不需要我们手动添加这一句代码的,因为angularjs本身在需要的时候调用,以达到我们所看到的数据双向绑定的效果。

但是因为我用了一个外部插件uploadify,然后在回调函数那里更新我controller的数据$scope.hasUpload = !$scope.hasUpload.....

因为外部插件本身已经脱离了angularjs的作用域,所以数据双向绑定在这里没有效果,只能手动添加$scope.$apply()来通知页面update数据。

AngularJS and scope.$apply 这篇文章讲的要详细,专业好多,可以帮助我们理解到scope.$apply,还有angularjs数据双向绑定的原理。。。

3、js按需加载

之前做应用的时候都会在首页就把全站的js预先加载进来。。。

怎么实现按需加载,在德问上看到一个方案用AngularJS构建单页应用,怎样根据需求加载JS文件?

搬到这里来:

首先在$routeProvider里面加resolve属性,

$routeProvider.
when('/phones', {
templateUrl: 'partials/phone-list.html',
controller: PhoneListCtrl,
resolve: PhoneListCtrl.resolve})

然后

function PhoneListCtrl($scope) {
//本身不用管,该怎么弄怎么弄
} PhoneListCtrl.resolve = {
delay: function($q) {
var delay = $q.defer(),
load = function(){
$.getScript('/js/xxxxx.js',function(){
delay.resolve();
});
};
load();
return delay.promise;
}
}

最新文章

  1. Linux下长时间ping网络加时间戳并记录到文本
  2. Seen.js – 使用 SVG 或者 Canvas 渲染 3D 场景
  3. Linux Default Bootup、Startup、Autoload Configuration file(自启动服务脚本)
  4. 10.Android之ProgressDialog进度对话框学习
  5. iOS开发中常见的问题
  6. (C#) System.BadImageFormatException: An attempt was made to load a program with an incorrect format.
  7. 1502: [NOI2005]月下柠檬树 - BZOJ
  8. c#中网络异常的处理办法
  9. Angular.js入门的样例
  10. 打印出不同顺序的字符串&amp;单引号和双引号的差异
  11. 动态规划晋级——POJ 3254 Corn Fields【状压DP】
  12. C# 移动端与PC端的数据交互
  13. webservice整合spring
  14. Dockerfile 编译安装mysql5.7 千万不要执行.只是记录一下编译安装罢了
  15. Java Web项目(Extjs)报错一
  16. 在IT行业获得成功 你只需一项技能[转]
  17. docker mesos集群资源调度平台
  18. ubuntu14安装node0.12.7
  19. DP入门基本问题
  20. docker容器使用

热门文章

  1. Linux基础(05)、Linux进阶命令
  2. Vue解决接口访问跨域问题
  3. thinkphp中的大字母的意思
  4. PHP读取excel
  5. Python学习4——print打印
  6. idea自动生成testNG.xml
  7. 简单R语言爬虫
  8. Java-谈谈对Java平台的理解
  9. UNIX故障--sun m4000服务器故障硬盘更换案例
  10. 20145209刘一阳 《网络对抗》Exp7 网络欺诈技术防范