avalon-rails 1.4.6.0.20150915133100 → 1.4.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,7 +5,7 @@
5
5
  http://weibo.com/jslouvre/
6
6
 
7
7
  Released under the MIT license
8
- avalon.shim.js(无加载器版本) 1.46 built in 2015.9.11
8
+ avalon.shim.js(无加载器版本) 1.4.7 built in 2015.10.13
9
9
  support IE6+ and other browsers
10
10
  ==================================================*/
11
11
  (function(global, factory) {
@@ -51,9 +51,6 @@ function log() {
51
51
 
52
52
 
53
53
  var subscribers = "$" + expose
54
- var otherRequire = window.require
55
- var otherDefine = window.define
56
- var innerRequire
57
54
  var stopRepeatAssign = false
58
55
  var rword = /[^, ]+/g //切割字符串为一个个小块,以空格或豆号分开它们,结合replace实现字符串的forEach
59
56
  var rcomplexType = /^(?:object|array)$/
@@ -301,10 +298,11 @@ function _number(a, len) { //用于模拟slice, splice的效果
301
298
  a = Math.floor(a) || 0
302
299
  return a < 0 ? Math.max(len + a, 0) : Math.min(a, len);
303
300
  }
301
+
304
302
  avalon.mix({
305
303
  rword: rword,
306
304
  subscribers: subscribers,
307
- version: 1.46,
305
+ version: 1.47,
308
306
  ui: {},
309
307
  log: log,
310
308
  slice: W3C ? function (nodes, start, end) {
@@ -357,38 +355,35 @@ avalon.mix({
357
355
  },
358
356
  eventHooks: [],
359
357
  /*绑定事件*/
360
- bind: function(el, type, fn, phase) {
358
+ bind: function (el, type, fn, phase) {
361
359
  var hooks = avalon.eventHooks
362
360
  var hook = hooks[type]
363
361
  if (typeof hook === "object") {
364
- type = hook.type
365
- if (hook.deel) {
366
- fn = hook.deel(el, type, fn, phase)
367
- }
362
+ type = hook.type || type
363
+ phase = hook.phase || !!phase
364
+ fn = hook.fn ? hook.fn(el,fn): fn
368
365
  }
369
- var callback = W3C ? fn : function(e) {
366
+ var callback = W3C ? fn : function (e) {
370
367
  fn.call(el, fixEvent(e));
371
368
  }
372
369
  if (W3C) {
373
- el.addEventListener(type, callback, !!phase)
370
+ el.addEventListener(type, callback, phase)
374
371
  } else {
375
372
  el.attachEvent("on" + type, callback)
376
373
  }
377
374
  return callback
378
375
  },
379
376
  /*卸载事件*/
380
- unbind: function(el, type, fn, phase) {
377
+ unbind: function (el, type, fn, phase) {
381
378
  var hooks = avalon.eventHooks
382
379
  var hook = hooks[type]
383
380
  var callback = fn || noop
384
381
  if (typeof hook === "object") {
385
- type = hook.type
386
- if (hook.deel) {
387
- fn = hook.deel(el, type, fn, false)
388
- }
382
+ type = hook.type || type
383
+ phase = hook.phase || !!phase
389
384
  }
390
385
  if (W3C) {
391
- el.removeEventListener(type, callback, !!phase)
386
+ el.removeEventListener(type, callback, phase)
392
387
  } else {
393
388
  el.detachEvent("on" + type, callback)
394
389
  }
@@ -830,7 +825,7 @@ if (!("onmouseenter" in root)) {
830
825
  }, function (origType, fixType) {
831
826
  eventHooks[origType] = {
832
827
  type: fixType,
833
- deel: function (elem, _, fn) {
828
+ fn: function (elem, fn) {
834
829
  return function (e) {
835
830
  var t = e.relatedTarget
836
831
  if (!t || (t !== elem && !(elem.compareDocumentPosition(t) & 16))) {
@@ -858,7 +853,7 @@ avalon.each({
858
853
  if (!("oninput" in DOC.createElement("input"))) {
859
854
  eventHooks.input = {
860
855
  type: "propertychange",
861
- deel: function (elem, _, fn) {
856
+ fn: function (elem, fn) {
862
857
  return function (e) {
863
858
  if (e.propertyName === "value") {
864
859
  e.type = "input"
@@ -878,7 +873,7 @@ if (DOC.onmousewheel === void 0) {
878
873
  var fixWheelDelta = fixWheelType === "wheel" ? "deltaY" : "detail"
879
874
  eventHooks.mousewheel = {
880
875
  type: fixWheelType,
881
- deel: function (elem, _, fn) {
876
+ fn: function (elem, fn) {
882
877
  return function (e) {
883
878
  e.wheelDeltaY = e.wheelDelta = e[fixWheelDelta] > 0 ? -120 : 120
884
879
  e.wheelDeltaX = 0
@@ -923,11 +918,7 @@ function escapeRegExp(target) {
923
918
  }
924
919
 
925
920
  var plugins = {
926
- loader: function (builtin) {
927
- var flag = innerRequire && builtin
928
- window.require = flag ? innerRequire : otherRequire
929
- window.define = flag ? innerRequire.define : otherDefine
930
- },
921
+
931
922
  interpolate: function (array) {
932
923
  openTag = array[0]
933
924
  closeTag = array[1]
@@ -1909,7 +1900,7 @@ function injectDisposeQueue(data, list) {
1909
1900
  var elem = data.element
1910
1901
  if (!data.uuid) {
1911
1902
  if (elem.nodeType !== 1) {
1912
- data.uuid = data.type + (data.pos || 0) + "-" + getUid(elem.parentNode)
1903
+ data.uuid = data.type + getUid(elem.parentNode)+ "-"+ (++disposeCount)
1913
1904
  } else {
1914
1905
  data.uuid = data.name + "-" + getUid(elem)
1915
1906
  }
@@ -2567,7 +2558,8 @@ var rdisplayswap = /^(none|table(?!-c[ea]).+)/
2567
2558
  var node = this[0]
2568
2559
  if (arguments.length === 0) {
2569
2560
  if (node.setTimeout) { //取得窗口尺寸,IE9后可以用node.innerWidth /innerHeight代替
2570
- return node["inner" + name] || node.document.documentElement[clientProp]
2561
+ return node["inner" + name] || node.document.documentElement[clientProp] ||
2562
+ node.document.body[clientProp]//IE6下前两个分别为undefine,0
2571
2563
  }
2572
2564
  if (node.nodeType === 9) { //取得页面尺寸
2573
2565
  var doc = node.documentElement
@@ -3277,7 +3269,7 @@ function scanExpr(str) {
3277
3269
  }
3278
3270
  value = str.slice(start, stop)
3279
3271
  if (value) { //处理{{ }}插值表达式
3280
- tokens.push(getToken(value, start))
3272
+ tokens.push(getToken(value))
3281
3273
  }
3282
3274
  start = stop + closeTag.length
3283
3275
  } while (1)
@@ -3292,11 +3284,10 @@ function scanExpr(str) {
3292
3284
  return tokens
3293
3285
  }
3294
3286
 
3295
- function scanText(textNode, vmodels, index) {
3296
- var bindings = []
3297
- tokens = scanExpr(textNode.data)
3287
+ function scanText(textNode, vmodels) {
3288
+ var bindings = [], tokens = scanExpr(textNode.data)
3298
3289
  if (tokens.length) {
3299
- for (var i = 0; token = tokens[i++]; ) {
3290
+ for (var i = 0, token; token = tokens[i++]; ) {
3300
3291
  var node = DOC.createTextNode(token.value) //将文本转换为文本节点,并替换原来的文本节点
3301
3292
  if (token.expr) {
3302
3293
  token.value = token.value.replace(roneTime, function () {
@@ -3309,7 +3300,6 @@ function scanText(textNode, vmodels, index) {
3309
3300
  token.type = "html"
3310
3301
  return ""
3311
3302
  })// jshint ignore:line
3312
- token.pos = index * 1000 + i
3313
3303
  bindings.push(token) //收集带有插值表达式的文本
3314
3304
  }
3315
3305
  avalonFragment.appendChild(node)
@@ -3773,7 +3763,6 @@ var TimerID, ribbon = []
3773
3763
  }
3774
3764
 
3775
3765
  var watchValueInTimer = noop
3776
- var rmsinput = /text|password|hidden/
3777
3766
  new function() { // jshint ignore:line
3778
3767
  try { //#272 IE9-IE11, firefox
3779
3768
  var setters = {}
@@ -3781,7 +3770,7 @@ new function() { // jshint ignore:line
3781
3770
  var bproto = HTMLTextAreaElement.prototype
3782
3771
  function newSetter(value) { // jshint ignore:line
3783
3772
  setters[this.tagName].call(this, value)
3784
- if (rmsinput.test(this.type) && !this.msFocus && this.avalonSetter) {
3773
+ if (!this.msFocus && this.avalonSetter && this.oldValue !== value) {
3785
3774
  this.avalonSetter()
3786
3775
  }
3787
3776
  }
@@ -3804,7 +3793,7 @@ new function() { // jshint ignore:line
3804
3793
  }
3805
3794
  } // jshint ignore:line
3806
3795
  if (IEVersion) {
3807
- avalon.bind(DOC, "selectionchange", function(e) {
3796
+ avalon.bind(DOC, "selectionchange", function (e) {
3808
3797
  var el = DOC.activeElement
3809
3798
  if (el && typeof el.avalonSetter === "function") {
3810
3799
  el.avalonSetter()
@@ -3813,25 +3802,25 @@ if (IEVersion) {
3813
3802
  }
3814
3803
 
3815
3804
  //处理radio, checkbox, text, textarea, password
3816
- duplexBinding.INPUT = function(element, evaluator, data) {
3805
+ duplexBinding.INPUT = function (element, evaluator, data) {
3817
3806
  var $type = element.type,
3818
- bound = data.bound,
3819
- $elem = avalon(element),
3820
- composing = false
3807
+ bound = data.bound,
3808
+ $elem = avalon(element),
3809
+ composing = false
3821
3810
 
3822
- function callback(value) {
3823
- data.changed.call(this, value, data)
3824
- }
3811
+ function callback(value) {
3812
+ data.changed.call(this, value, data)
3813
+ }
3825
3814
 
3826
- function compositionStart() {
3827
- composing = true
3828
- }
3815
+ function compositionStart() {
3816
+ composing = true
3817
+ }
3829
3818
 
3830
- function compositionEnd() {
3831
- composing = false
3832
- }
3833
- //当value变化时改变model的值
3834
- var updateVModel = function() {
3819
+ function compositionEnd() {
3820
+ composing = false
3821
+ }
3822
+ //当value变化时改变model的值
3823
+ var updateVModel = function () {
3835
3824
  var val = element.value //防止递归调用形成死循环
3836
3825
  if (composing || val === element.oldValue) //处理中文输入法在minlengh下引发的BUG
3837
3826
  return
@@ -3842,27 +3831,27 @@ duplexBinding.INPUT = function(element, evaluator, data) {
3842
3831
  }
3843
3832
  }
3844
3833
  //当model变化时,它就会改变value的值
3845
- data.handler = function() {
3846
- var val = data.pipe(evaluator(), data, "set") +"" //fix #673
3834
+ data.handler = function () {
3835
+ var val = data.pipe(evaluator(), data, "set") //fix #673
3847
3836
  if (val !== element.oldValue) {
3848
- element.value = element.oldValue = val
3837
+ element.value = element.oldValue = val
3849
3838
  }
3850
3839
  }
3851
3840
  if (data.isChecked || $type === "radio") {
3852
3841
  var IE6 = IEVersion === 6
3853
- updateVModel = function() {
3842
+ updateVModel = function () {
3854
3843
  if ($elem.data("duplexObserve") !== false) {
3855
3844
  var lastValue = data.pipe(element.value, data, "get")
3856
3845
  evaluator(lastValue)
3857
3846
  callback.call(element, lastValue)
3858
3847
  }
3859
3848
  }
3860
- data.handler = function() {
3849
+ data.handler = function () {
3861
3850
  var val = evaluator()
3862
- var checked = data.isChecked ? !! val : val + "" === element.value
3851
+ var checked = data.isChecked ? !!val : val + "" === element.value
3863
3852
  element.oldValue = checked
3864
3853
  if (IE6) {
3865
- setTimeout(function() {
3854
+ setTimeout(function () {
3866
3855
  //IE8 checkbox, radio是使用defaultChecked控制选中状态,
3867
3856
  //并且要先设置defaultChecked后设置checked
3868
3857
  //并且必须设置延迟
@@ -3875,7 +3864,7 @@ duplexBinding.INPUT = function(element, evaluator, data) {
3875
3864
  }
3876
3865
  bound("click", updateVModel)
3877
3866
  } else if ($type === "checkbox") {
3878
- updateVModel = function() {
3867
+ updateVModel = function () {
3879
3868
  if ($elem.data("duplexObserve") !== false) {
3880
3869
  var method = element.checked ? "ensure" : "remove"
3881
3870
  var array = evaluator()
@@ -3889,7 +3878,7 @@ duplexBinding.INPUT = function(element, evaluator, data) {
3889
3878
  }
3890
3879
  }
3891
3880
 
3892
- data.handler = function() {
3881
+ data.handler = function () {
3893
3882
  var array = [].concat(evaluator()) //强制转换为数组
3894
3883
  var val = data.pipe(element.value, data, "get")
3895
3884
  element.checked = array.indexOf(val) > -1
@@ -3902,11 +3891,11 @@ duplexBinding.INPUT = function(element, evaluator, data) {
3902
3891
  }
3903
3892
 
3904
3893
  function delay(e) { // jshint ignore:line
3905
- setTimeout(function() {
3894
+ setTimeout(function () {
3906
3895
  updateVModel(e)
3907
3896
  })
3908
3897
  }
3909
- events.replace(rword, function(name) {
3898
+ events.replace(rword, function (name) {
3910
3899
  switch (name) {
3911
3900
  case "input":
3912
3901
  if (!IEVersion) { // W3C
@@ -3920,7 +3909,7 @@ duplexBinding.INPUT = function(element, evaluator, data) {
3920
3909
  if (IEVersion > 8) {
3921
3910
  bound("input", updateVModel) //IE9使用propertychange无法监听中文输入改动
3922
3911
  } else {
3923
- bound("propertychange", function(e) { //IE6-8下第一次修改时不会触发,需要使用keydown或selectionchange修正
3912
+ bound("propertychange", function (e) { //IE6-8下第一次修改时不会触发,需要使用keydown或selectionchange修正
3924
3913
  if (e.propertyName === "value") {
3925
3914
  updateVModel()
3926
3915
  }
@@ -3936,15 +3925,16 @@ duplexBinding.INPUT = function(element, evaluator, data) {
3936
3925
  break
3937
3926
  }
3938
3927
  })
3939
- bound("focus", function() {
3928
+ bound("focus", function () {
3940
3929
  element.msFocus = true
3941
3930
  })
3942
- bound("blur", function() {
3931
+ bound("blur", function () {
3943
3932
  element.msFocus = false
3944
3933
  })
3945
3934
 
3946
- if (rmsinput.test($type)) {
3947
- watchValueInTimer(function() {
3935
+ if (!/^(file|button|reset|submit|checkbox|radio)$/.test(element.type)) {
3936
+ element.avalonSetter = updateVModel //#765
3937
+ watchValueInTimer(function () {
3948
3938
  if (root.contains(element)) {
3949
3939
  if (!element.msFocus && element.oldValue !== element.value) {
3950
3940
  updateVModel()
@@ -3954,11 +3944,9 @@ duplexBinding.INPUT = function(element, evaluator, data) {
3954
3944
  }
3955
3945
  })
3956
3946
  }
3957
-
3958
- element.avalonSetter = updateVModel //#765
3947
+
3959
3948
  }
3960
3949
 
3961
- element.oldValue = element.value
3962
3950
  avalon.injectBinding(data)
3963
3951
  callback.call(element, element.value)
3964
3952
  }
@@ -4170,6 +4158,9 @@ bindingHandlers.repeat = function (data, vmodels) {
4170
4158
  }
4171
4159
  }
4172
4160
 
4161
+ data.handler = noop
4162
+ avalon.injectBinding(data)
4163
+
4173
4164
  var elem = data.element
4174
4165
  if (elem.nodeType === 1) {
4175
4166
  elem.removeAttribute(data.name)
@@ -4238,7 +4229,12 @@ bindingExecutors.repeat = function (method, pos, el) {
4238
4229
 
4239
4230
  if (data.xtype === "array") {
4240
4231
  if (old.length === neo.length) {
4241
- return
4232
+ if (old !== neo && old.length > 0) {
4233
+ bindingExecutors.repeat.call(this, 'clear', pos, el)
4234
+ }
4235
+ else {
4236
+ return
4237
+ }
4242
4238
  }
4243
4239
  method = "add"
4244
4240
  pos = 0
@@ -4750,9 +4746,9 @@ var filters = avalon.filters = {
4750
4746
  $filter: function(val) {
4751
4747
  for (var i = 1, n = arguments.length; i < n; i++) {
4752
4748
  var array = arguments[i]
4753
- var fn = avalon.filters[array.shift()]
4749
+ var fn = avalon.filters[array[0]]
4754
4750
  if (typeof fn === "function") {
4755
- var arr = [val].concat(array)
4751
+ var arr = [val].concat(array.slice(1))
4756
4752
  val = fn.apply(null, arr)
4757
4753
  }
4758
4754
  }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: avalon-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.6.0.20150915133100
4
+ version: 1.4.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - zj0713001
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-09-15 00:00:00.000000000 Z
11
+ date: 2015-11-03 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: This gem provides javascript framework Avalon for your Rails 3+ application.
14
14
  email:
@@ -17,8 +17,8 @@ executables: []
17
17
  extensions: []
18
18
  extra_rdoc_files: []
19
19
  files:
20
- - .DS_Store
21
- - .gitignore
20
+ - ".DS_Store"
21
+ - ".gitignore"
22
22
  - Gemfile
23
23
  - LICENSE.txt
24
24
  - README.md
@@ -48,17 +48,17 @@ require_paths:
48
48
  - lib
49
49
  required_ruby_version: !ruby/object:Gem::Requirement
50
50
  requirements:
51
- - - ! '>='
51
+ - - ">="
52
52
  - !ruby/object:Gem::Version
53
53
  version: '0'
54
54
  required_rubygems_version: !ruby/object:Gem::Requirement
55
55
  requirements:
56
- - - ! '>='
56
+ - - ">="
57
57
  - !ruby/object:Gem::Version
58
58
  version: '0'
59
59
  requirements: []
60
60
  rubyforge_project:
61
- rubygems_version: 2.4.4
61
+ rubygems_version: 2.4.8
62
62
  signing_key:
63
63
  specification_version: 4
64
64
  summary: Use javascript framework Avalon with Rails 3+