上篇为大家讲解了股票分时的基本用法,这次接着上篇谈谈K线图,分时图和K线图都属于highstock里的功能图表,所以在使用上基本上相同,但也略有区别。
highstock高级篇之股票分时图
EasyUI datagrid实现翻页客户端保存checkbox状态
1、首先设置datagrid属性的idField主键,这里假如为id,若idField为其他的,记住下面的代码里的 id也要做相应的修改。
2、建立一个全局的javascript数组var checkedItems = [],用来存放选中checkbox的值。
3、核心方法,addcheckItem()
、removeAllItem(rows)
、removeSingleItem(rowIndex, rowData)
当选中或者取消checkbox时触发。
用来将checkbox的主键值保存在checkedItems数组,或者从数组中删除对应的id值,findCheckedItem(ID)这个函数用来查找数组中是否存在checkbox的值,存在则返回id值,不存在则返回-1.
4、什么时候调用这些方法呢?分别在datagrid
的 onCheckAll: addcheckItem
,onCheck: addcheckItem
,onUncheckAll: removeAllItem
,onUncheck: removeSingleItem
这四个事件中调用对应的方法。
5、翻页后如何给checkbox赋值呢?关键就在这里,datagrid重写了$.fn.datagrid.defaults.view
的onAfterRender
事件,因此在datagrid的view事件里绑定这个函数就OK了。onAfterRender
事件是当easyui的元素渲染完毕后执行的事件,在这里会调用手写的 ischeckItem 函数来实现对checkbox的赋值!
下面为大家贴上实现的具体代码:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44 $("#maingrid").datagrid({
idField: 'id',
view: fileview
});
var fileview = $.extend({}, $.fn.datagrid.defaults.view, { onAfterRender: function (target) { ischeckItem(); } });
var checkedItems = [];
function ischeckItem() {
for (var i = 0; i < checkedItems.length; i++) {
$('#maingrid').datagrid('selectRecord', checkedItems[i]); //根据id选中行
}
}
function findCheckedItem(ID) {
for (var i = 0; i < checkedItems.length; i++) {
if (checkedItems[i] == ID) return i;
}
return -1;
}
function addcheckItem() {
var row = $('#maingrid').datagrid('getChecked');
for (var i = 0; i < row.length; i++) {
if (findCheckedItem(row[i].id) == -1) {
checkedItems.push(row[i].id);
}
}
}
function removeAllItem(rows) {
for (var i = 0; i < rows.length; i++) {
var k = findCheckedItem(rows[i].id);
if (k != -1) {
checkedItems.splice(i, 1);
}
}
}
function removeSingleItem(rowIndex, rowData) {
var k = findCheckedItem(rowData.id);
if (k != -1) {
checkedItems.splice(k, 1);
}
}
下面是批量删除的代码1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28function destroyItems(items) {
var row = null;
if (items == "list") {
items = checkedItems.join(',');
row = $('#maingrid').datagrid('getSelections');
}
else {
row = items;
}
if (row != null) {
$.messager.confirm('Confirm', '您确定要删除此记录?', function (r) {
if (r) {
$.post(location.href, { id: items, action: "deletelist" }, function (result) {
if (result == "1") {
$('#maingrid').datagrid('reload');
} else {
$.messager.show({
title: 'Error',
msg: result
});
}
});
}
});
}
else { $.messager.alert('-警告-', '请选择至少一条记录才能进行删除', 'info'); }
}
一个小攻城师2014年的总结
今儿是2014的最后一天,我是不是要写点东西总结下自己呢?
2014年一路走过
对于一个北漂的人来说,唉,每年都TMD过的太快了,一线城市的生活就是这么快节奏,就是这么任性!还计划着今年要干什么干什么,却一晃就漂到年底了,猛的醒过来,“fuck,什么都没完成!于是有了下面一幅图的出现”
看完这个段子,大家是不是感觉趟枪了,o(∩_∩)o 哈哈,事实就是这个样子!
说点认真的吧,这年还是收获很多的。
工作上,掌握一些新的技术和一些编程理念,最重要的是自己由后台慢慢转变为一名前端攻城师,接触了angularjs
前端框架,后端语言也由asp.net
转变成了 java
,遇到问题更加冷静去思考去寻找解决问题的方案。总之呢,时间长了,会突然觉得所谓的大神,所谓的高手 不是他们的技术有多牛,不是他们的学历有多高,而是在工作中日积月累的解决问题的能力,慢慢培养出解决问题的思维方式和编程理念,当然我不否认在此基础之上需要夯实的基础知识!
在说说大部队吧,由开始的十几个人,由于各种原因,走了一批人,来了一批人,来不及感伤,来不及道别,只能快速融入新组建的团队中。然后嘻嘻嘻哈哈开始新产品的规划与开发。很幸运,大家相处很融洽和舒服,我们在朝着共同的目标奋斗着,希望有一天我们的产品能有越来越多的用户!
我呢,是一个不善言谈的人,在人际交际中,不喜欢阿谀奉承,不喜欢勾心斗角,不喜欢拍人马屁,喜欢较真,喜欢说大实话。说到这里,像我这种性格的人也许不适合在当今的社会中生存,更别说什么搞好层级关系,职位提升等等。但随着时间的流逝和自己意志力的流逝,自己总会被周遭所同化,你必须学会阿谀奉承、必须学会拍人马屁、必须学会掩饰自己,必须学会如何处理人际关系,我们必须扮演好在生活中、在工作中的角色,正如 《楚门的世界》 里所反应的,我们每个人都是生活中的演员!
highchart 自定义事件插件
highchart 插件之自定义事件
下面是扩展插件的代码
1 | (function (HC) { |
highchart legend 可拖拽扩展
highchart 插件之legend 拖拽扩展
下面是扩展插件的代码
1 | (function (H) { |
前端初始化代码
1 | $(function () { |
效果图
Highcharts部分图表圆角显示
highchart 插件之给column和bar 圆角
下面是扩展插件的代码
1 | (function (H) { |
前端初始化代码
1 | $(function () { |
效果图
highchart 点击图表弹出层展示新图表
如何监听angularjs列表数据是否渲染完毕
有时候我们需要在ng列表元素渲染完毕后去执行一段js脚本,
angularjs
刚好提供了ng-repeat
的一个属性$last
,然后为大家简单介绍2种方式
第一种通过回调函数
前端HTML
1 | <ul class="smart-timeline-list"> |
#####js脚本1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19angular.module('mainApp').directive('onFinishRenderFilters', function ($timeout) {
return {
restrict: 'A',
link: function(scope,element,attr) {
if (scope.$last === true) {
var finishFunc=scope.$parent[attr.onFinishRenderFilters];
if(finishFunc)
{
finishFunc();
}
}
}
};
})
.controller('test',["$scope",function($scope){
$scope.Complete=function(){
$('#div_scrollbar').tinyscrollbar();
}
}]);
- 分析:on-finish-render-filters 传入一个回调函数Complete ,渲染时每次会判断当前渲染记录是否为最后一条,若为最后一条,则执行Complete 函数。
第二种方法是用消息传递的机制
1 | <ul class="smart-timeline-list"> |
js脚本
1 | angular.module('mainApp').directive('onFinishRenderFilters', function ($timeout) { |
- 分析:渲染时同样每次会判断当前渲染记录是否为最后一条,若为最后一条,则想父类或者子类的controller传递消息,对应的controller里添加消息的接受监听方法。
highchart+table 结合phantomjs 一并生成图片
其实是看到群里有小伙伴有这个需求,我才制作了这个DEMO,因为之前用phantomjs实现过纯后台导出图片,所以顺便改了下以前的DEMO分享给大家。
phantomjs 纯后台导出 请参考:http://www.peng8.net/2014/07/21/render-charts-serverside/
准备工作
- 去官网下载最新的phantomjs,官网提供三个版本下载,我电脑是window 7,所以用的是windows版,至于其他系统的请下载对应的版本。
- 解压文件,只需要对应的处理文件,例如windows版本里的就要
phantomjs.exe
和rasterize.js
,rasterize.js 用来向 phantomjs 发起请求生成快照
前端整理
- 这里我们需要2个页面,一个页面用来专门显示图表(default),一个用来触发弹出图表(index)
为什么我们需要2个页面呢?因为这里我们是用到了phantomjs的一个功能,生成快照!所以需要一个干净的页面,只有图表,图片生成的内容也就是我们想要生成最后样子的图片。 - 我借用了
lhgdialog
弹窗插件来弹出展现我们要生成的图表