config是一个待注入的value,它的值是{count:  1}

看代码(用普通函数的写法):

$routeProvider.when '/test',
template: "Hello{{vm.abc()}}"
controllerAs: "vm"
controller: (config) ->
@abc = –>
return config.count
@test = {
api: config.count
}

这段代码工作不正常:vm.test.api什么也没有,事实上,vm的值是{count: 1},而我们期望的值是{test: {count: 1}}。原因何在?因为每个controller都会被new出来,而这个controller定义的代码相当于:

function SomeNameCtrl(config) {
this.abc = function() {
    return config.count;
  }
  this.test = {
api: config.count;
}
return this.test; // 注意这句!
}

注意最后这个return!它是coffee的一个特性:自动返回最后一个语句的结果。

有人喜欢这种语法特性,但是对我来说,特别是在这种场景下,它太讨厌了。

如何改正这个问题呢?

一个很简单的写法是手动加上一个return语句:

$routeProvider.when '/test',
template: "Hello{{vm.abc()}}"
controllerAs: "vm"
controller: (config) ->
@abc = –>
return config.count
@test = {
api: config.count
}
return @

这种写法确实能解决问题,而且没有bug,不过……这种写法好丑啊。后来@破狼提出了一个更简单的解决办法,那就是用coffee的class语法,代码如下:

$routeProvider.when '/test',
template: "Hello{{vm.abc()}}"
controllerAs: "vm"
controller: class TestCtrl
constructor: (@config) ->
@test = {
api: config.root
}
abc: ->
return @config.root

很漂亮的解决方案,再也不用担心忘记什么语句了!我们用Coffee类代替了以前版本的普通函数,而这,也正是new操作符所希望得到的。

在概念层面上,controller也确实应该是个类,除此之外,service也是类的概念。

所以,这个问题的本质在于我们用一个普通函数的形式定义了一个Coffee类,而这导致了第一组代码的奇怪bug。

不过,上面这段代码还有一个问题:无法被正常的minify,这个问题的解决和传统的方式很相似,代码如下:

$routeProvider.when '/test',
template: "Hello{{vm.abc()}}"
controllerAs: "vm"
controller: ['config', class TestCtrl
constructor: (@config) ->
@test = {
api: config.root
}
abc: ->
return @config.root
]

原创:Angular + controllerAs + CoffeeScript的一个问题,及其解决方案的更多相关文章

  1. Angular学习笔记—创建一个angular项目

    开始项目前,你需要先安装node和npm,然后执行npm install -g @angular/cli安装Angular CLI. 如何安装node.js和npm npm使用介绍 1.安装angul ...

  2. 【原创】经验分享:一个小小emoji尽然牵扯出来这么多东西?

    前言 之前也分享过很多工作中踩坑的经验: 一个线上问题的思考:Eureka注册中心集群如何实现客户端请求负载及故障转移? [原创]经验分享:一个Content-Length引发的血案(almost.. ...

  3. 如何在嵌入式Linux上开发一个语音通信解决方案

    开发一个语音通信解决方案是一个软件项目.既然是软件项目,就要有相应的计划:有多少功能,安排多少软件工程师去做,这些工程师在这一领域的经验如何,是否需要培训,要多长时间做完,中间有几个主要的milest ...

  4. 使用angular.js开发的一个简易todo demo

    前沿 在CVTE实习考察的一周里,接触到了angular,并在最后的一天任务里要求使用angular做一个功能主要包括创建.编辑.恢复.删除以及留言的todo demo,并支持响应式布局.因为之前没怎 ...

  5. 关于angular双向绑定的一个问题,百度无果,还请帮忙解惑。

    用了一段时间anjular蛮好用的.其实用的功能不多.主要用于列表数据绑定以及一些简单效果的绑定,但是最近出现一个现象,百度无果,居然没有人遇到.现在描述一下,截图不方便,希望有人解惑. 列表ng-r ...

  6. 【原创】最近写的一个比较hack的小爬虫

    目标:爬取爱漫画上面自己喜欢的一个漫画 分析阶段: 0.打开爱漫画主页,迎面就是一坨js代码..直接晕了 1.经过抓包和对html源码的分析,可以发现爱漫画通过另外一个域名发送图片,而当前域名中通过j ...

  7. 【原创】自己动手写一个能操作redis的客户端

    引言 redis大家在项目中经常会使用到.官网也提供了多语言的客户端供大家操作redis,如下图所示 但是,大家有思考过,这些语言操作redis背后的原理么?其实,某些大神会说 只要按照redis的协 ...

  8. Angular内提供了一个可以快速建立测试用web服务的方法:内存 (in-memory) 服务器

    如何使用 Angular 内存 (in-memory) 服务器https://segmentfault.com/a/1190000009898540

  9. 【原创】经验分享:一个Content-Length引发的血案(almost....)

    前言 上周在工作中遇到一个问题,挺有意思,这里记录一下.上周在工作中遇到一个问题,挺有意思,这里记录一下.标题起的很唬人,这个问题差点引发血案,花哥还是很严谨的一个人,后面备注了almost.... ...

随机推荐

  1. 维多利亚的秘密 golang入坑系列

    原文在gitbook,字字原创,版权没有,转载随意. 在写本文的前一天,2017维密在上海开始了. 为了纪念屌丝界的盛世,特为本节起名维多利亚的秘密.现在的社会,要想出名只有抓眼球.所以写份技术文章, ...

  2. 使用pycharm操作django

    新建项目,选择已经建立好的虚拟环境 进入指令界面 新建app 添加一些文件和文件夹用于以后存放各种数据 settings设置 TEMPLATES设置 TEMPLATES = [ { 'BACKEND' ...

  3. 前端基础之JavaScript(Day53)

    阅读目录 一.JavaScript基础 二.JavaScript对象 三.BOM对象 一.JavaScript基础 http://www.cnblogs.com/yuanchenqi/articles ...

  4. git命令与协同开发

    一 git命令 1.简单命令 git init # 初始化 (建立git 版本相关文件关系都放这里) git config --global user.email "you@example. ...

  5. python 系统相关操作

    1.文件 open()代开文件或者创建文件 fout=open('oops.txt','wt') print('Oops, I created a file.',file=fout) fout.clo ...

  6. React:快速上手(2)——组件通信

    React:快速上手(2)——组件通信 向父组件传递数据 父组件可以通过设置子组件的props属性进行向子组件传值,同时也可以传递一个回调函数,来获取到子组件内部的数据. 效果演示 子组件是输入框,父 ...

  7. 08 Spring框架 AOP (一)

    首先我们先来介绍一下AOP: AOP(Aspect Orient Programming),面向切面编程,是面向对象编程OOP的一种补充.面向对象编程是从静态角度考虑程序的结构,面向切面编程是从动态的 ...

  8. PAT 天梯赛 L1-022. 奇偶分家 【水】

    题目链接 https://www.patest.cn/contests/gplt/L1-022 AC代码 #include <iostream> #include <cstdio&g ...

  9. js小技巧(收集的)

    一.事件源对象 event.srcElement.tagName //IE浏览器 event.srcElement.type event.target.tagName //dom浏览器 event.t ...

  10. Linux系统下强大的lsof命令使用宝典

    lsof命令简介: lsof(list open files)是一个列出当前系统打开文件的工具.在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件 ...