Просмотр исходного кода

`number` option for v-select (fixes #642)

Evan You 11 лет назад
Родитель
Сommit
c0726dc0d3
2 измененных файлов с 31 добавлено и 1 удалено
  1. 7 1
      src/directives/model/select.js
  2. 24 0
      test/unit/specs/directives/model_spec.js

+ 7 - 1
src/directives/model/select.js

@@ -11,11 +11,15 @@ module.exports = {
     if (optionsParam) {
     if (optionsParam) {
       initOptions.call(this, optionsParam)
       initOptions.call(this, optionsParam)
     }
     }
+    this.number = this._checkParam('number') != null
     this.multiple = el.hasAttribute('multiple')
     this.multiple = el.hasAttribute('multiple')
     this.listener = function () {
     this.listener = function () {
       var value = self.multiple
       var value = self.multiple
         ? getMultiValue(el)
         ? getMultiValue(el)
         : el.value
         : el.value
+      value = self.number
+        ? _.toNumber(value)
+        : value
       self.set(value, true)
       self.set(value, true)
     }
     }
     _.on(el, 'change', this.listener)
     _.on(el, 'change', this.listener)
@@ -124,7 +128,9 @@ function checkInitialValue () {
     }
     }
   }
   }
   if (initValue) {
   if (initValue) {
-    this._initValue = initValue
+    this._initValue = this.number
+      ? _.toNumber(initValue)
+      : initValue
   }
   }
 }
 }
 
 

+ 24 - 0
test/unit/specs/directives/model_spec.js

@@ -273,6 +273,30 @@ if (_.inBrowser) {
       expect(opts[2].selected).toBe(false)
       expect(opts[2].selected).toBe(false)
     })
     })
 
 
+    it('select + number', function () {
+      var vm = new Vue({
+        el: el,
+        data: {
+          test: '1'
+        },
+        template: '<select v-model="test" number><option value="1">1</option></select>'
+      })
+      expect(vm.test).toBe('1')
+      trigger(vm.$el.firstChild, 'change')
+      expect(vm.test).toBe(1)
+    })
+
+    it('select + number initial value', function () {
+      var vm = new Vue({
+        el: el,
+        data: {
+          test: '1'
+        },
+        template: '<select v-model="test" number><option value="1" selected>1</option></select>'
+      })
+      expect(vm.test).toBe(1)
+    })
+
     it('text', function (done) {
     it('text', function (done) {
       var vm = new Vue({
       var vm = new Vue({
         el: el,
         el: el,