Przeglądaj źródła

Merge pull request #718 from calebboyd/dev

fix #712: allow filters on options expression of v-model
Evan You 11 lat temu
rodzic
commit
67a376ce84

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

@@ -1,5 +1,6 @@
 var _ = require('../../util')
 var Watcher = require('../../watcher')
+var dirParser = require('../../parsers/directive')
 
 module.exports = {
 
@@ -61,6 +62,7 @@ module.exports = {
 
 function initOptions (expression) {
   var self = this
+  var descriptor = dirParser.parse(expression)[0]
   function optionUpdateWatcher (value) {
     if (_.isArray(value)) {
       self.el.innerHTML = ''
@@ -74,9 +76,12 @@ function initOptions (expression) {
   }
   this.optionWatcher = new Watcher(
     this.vm,
-    expression,
+    descriptor.expression,
     optionUpdateWatcher,
-    { deep: true }
+    {
+      deep: true,
+      filters: _.resolveFilters(this.vm, descriptor.filters)
+    }
   )
   // update with initial value
   optionUpdateWatcher(this.optionWatcher.value)

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

@@ -313,6 +313,27 @@ if (_.inBrowser) {
       expect(vm.test).toBe(1)
     })
 
+    it('select + options + filter', function () {
+      var vm = new Vue({
+        el: el,
+        data: {
+          opts: ['a','b']
+        },
+        filters: {
+          aFilter: function (opts){
+            return opts.map(function (val,i){
+              return val + i
+            })
+          }
+        },
+        template: '<select v-model="test" options="opts | aFilter"></select>'
+      })
+      expect(el.firstChild.innerHTML).toBe(
+          '<option value="a0">a0</option>' +
+          '<option value="b1">b1</option>'
+      )
+    })
+
     it('text', function (done) {
       var vm = new Vue({
         el: el,