用户反馈

@消失的键盘 在论坛反馈了一个问题,在 AppBoxMvc 中的 Title 模型中,如果将 Name 属性改名为小写的 name 属性,就会报错:

因为这是一个 ASP.NET MVC 的项目,而这个属性是通过 TextBoxFor 渲染到页面上的,因此 name 会生成为 DOM 节点的 id 属性:

F.SimpleForm()
.ID("SimpleForm1")
.ShowBorder(false)
.ShowHeader(false)
.BodyPadding()
.Items(
F.TextBoxFor(m => m.name),
F.TextAreaFor(m => m.Remark)
)

按道理说这也没什么,虽然有点别扭,但是也没有规定说name字符串不能作为id属性的值。

并且从另一个方面讲,name 也不是 JavaScript 的关键字,不可能冲突阿。

分析问题

还是从代码入手,经过简单的调试,发现 id=name 的这个文本输入框对象居然找不到,而这个对象是保存在 F.ui 上面的。

首先我们看下 F.ui 的定义:

F.ui = function(item) {
var itemType = F.getType(item.type || 'component');
return new itemType(item);
};

为了方便用户书写代码,FineUIMvc中 F.ui 其实有两个用途:

1. 用作函数:创建控件,可以在JS中通过 F.ui 来创建一个控件:

F.ui({
type: 'button', renderTo: document.body, text: '按钮', id:'button1',
listeners: {
click: function (event) {
F.alert('你点击了按钮');
}
}
});

2. 用作对象:保存控件,可以在JS中通过 F.ui 来引用一个控件(比如上面创建的按钮):

F.ui.button1

这样一分析问题就来了,因为本身JS函数是有属性的,这里由于 F.ui 是个匿名函数,所以 F.ui.name == '' (这个函数的 name 属性为空字符串)

对于一个普通的函数,这个name属性就是函数名称,如下所示:

function test1() { }
console.log(test1.name) // "test1"

其实JavaScript 函数不仅有 name 属性,还是 length , caller, arguments, toString .... 等很多属性,在Chrome的调试工具中可以方便的查看:

所以,当我们试图将名为 name 的文本输入框对象保存到 F.ui 上时,其实是不成功的,此时 F.ui.name 依然为空字符串。

解决问题

由于 F.ui 的两个作用已经被网友所熟知,并且已经应用到很多项目中了,不能因为几个特殊属性的冲突就废弃这种做法。那么怎么规避这个问题呢?

我们使用了一个内部变量来保存页面上的控件实例:

F._fjs_objects = {};

同时为了兼容之前的代码,F.ui 函数仍然用来保存控件实例,只不过在保存之前要先进行判断,如果传入的名称是函数属性名的话,就不要保存:

function nameIsPropertyOfFunction(name) {
return $.inArray(name, ['arguments', 'caller', 'length', 'name']) >=0 || $.isFunction(F.ui[name]);
} F._fjs_addToFObjects = function(objId, obj) {
F._fjs_objects[objId] = obj; if(!nameIsPropertyOfFunction(objId)) {
F.ui[objId] = obj;
}
};

优化后,之前的所有代码都不用改动,你仍然可以通过两种方式获取控件实例:

1. F('controlid')
2. F.ui.controlid

而对于非常特殊的情况,控件ID为 name, length, toString (当然我们极力不推荐你用这样的名称来命名控件ID!!)时,页面也不会出错,只不过你不能再通过F.ui.name 来获取控件了,只能通过 F('name') 来获取控件对象。

最新文章

  1. Entity Framework Code First 中使用 Fluent API 笔记。
  2. Openstack Day1简介及虚拟环境搭建
  3. ASP.NET MVC使用SSI来实现页面静态化
  4. 几个有用的jQuery代码片段
  5. 百度地图API示例之添加定位相关控件
  6. iOS - OC NSArray 数组
  7. windows下php+apache+mysql环境搭建
  8. 使用GDI+绘制的360风格按钮控件(使用CN_DRAWITEM消息重绘,并使用TGPGraphics,TGPPen,TGPImage,TGPBitmap等)good
  9. Spring Boot HTTP over JSON 的错误码异常处理
  10. BZOJ 2748: [HAOI2012]音量调节【二维dp,枚举】
  11. centos7 搭建jenkins服务器
  12. java 生产者消费者简单实现demo
  13. java基础(十七)----- 浅谈Java中的深拷贝和浅拷贝 —— 面试必问
  14. bootstrap-treeview树形图参数详解
  15. Windows下用户变量和系统变量
  16. ajax操作之操作 JavaScript 对象
  17. 8 -- 深入使用Spring -- 2...1 搜索Bean类
  18. Python3.6学习笔记(四)
  19. SICP-Exercise 1.5
  20. idea使用插件activate-power-mode给编码加上特效和带来乐趣。

热门文章

  1. (后端)maven仓库
  2. Mac 电脑如何安装mac os 和win7双系统(win7多分区)
  3. Azure SQL Virtual Machine报Login failed for user 'NT Service\SqlIaaSExtension'. Reason: Could not find a login matching the name provided
  4. ArcGIS Server服务器监控
  5. Python语法的转义字符
  6. emacs 配置.emacs
  7. ELK收集tomcat访问日志并存取mysql数据库案例
  8. LeetCode算法题-Lowest Common Ancestor of a Binary Search Tree
  9. Linux 小知识翻译 - 「/proc 文件夹」
  10. Spring AOP 术语