|
1 | 1 | (function () { |
2 | 2 | function VueRx (Vue, Rx) { |
3 | | - if (!Rx) { |
4 | | - throw new Error( |
5 | | - 'vue-rx requires passing the Rx object to Vue.use() as the 2nd argument.' |
6 | | - ) |
7 | | - } |
| 3 | + var warn = Vue.util.warn || function () {} |
8 | 4 |
|
9 | | - var VueVersion = Number(Vue.version && Vue.version.split('.')[0]) |
10 | | - var initHook = VueVersion && VueVersion > 1 ? 'beforeCreate' : 'init' |
| 5 | + function defineReactive (vm, key, val) { |
| 6 | + if (key in vm) { |
| 7 | + vm[key] = val |
| 8 | + } else { |
| 9 | + Vue.util.defineReactive(vm, key, val) |
| 10 | + } |
| 11 | + } |
11 | 12 |
|
12 | | - var mixin = { |
| 13 | + Vue.mixin({ |
| 14 | + created () { |
| 15 | + var vm = this |
| 16 | + var obs = vm.$options.subscriptions |
| 17 | + if (typeof obs === 'function') { |
| 18 | + obs = obs.call(vm) |
| 19 | + } |
| 20 | + if (!obs) return |
| 21 | + vm._rxHandles = [] |
| 22 | + Object.keys(obs).forEach(function (key) { |
| 23 | + defineReactive(vm, key, undefined) |
| 24 | + var ob = obs[key] |
| 25 | + if (!ob || typeof ob.subscribe !== 'function') { |
| 26 | + warn('Invalid Observable found in rx option with key "' + key + '".', vm) |
| 27 | + return |
| 28 | + } |
| 29 | + vm._rxHandles.push(obs[key].subscribe(function (value) { |
| 30 | + vm[key] = value |
| 31 | + })) |
| 32 | + }) |
| 33 | + }, |
13 | 34 | beforeDestroy: function () { |
14 | 35 | if (this._rxHandles) { |
15 | 36 | this._rxHandles.forEach(function (handle) { |
|
21 | 42 | }) |
22 | 43 | } |
23 | 44 | } |
24 | | - } |
| 45 | + }) |
25 | 46 |
|
26 | | - mixin[initHook] = function init () { |
27 | | - var self = this |
28 | | - var dataFn = this.$options.data |
29 | | - if (dataFn) { |
30 | | - this.$options.data = function () { |
31 | | - var raw = dataFn() |
32 | | - Object.keys(raw).forEach(function (key) { |
33 | | - var val = raw[key] |
34 | | - if (val && val.subscribe instanceof Function) { |
35 | | - raw[key] = null |
36 | | - ;(self._rxHandles || (self._rxHandles = [])) |
37 | | - .push(val.subscribe(function (value) { |
38 | | - self[key] = raw[key] = value |
39 | | - })) |
40 | | - } |
41 | | - }) |
42 | | - return raw |
43 | | - } |
| 47 | + Vue.prototype.$watchAsObservable = function (expOrFn, options) { |
| 48 | + if (!Rx) { |
| 49 | + warn( |
| 50 | + '$watchAsObservable requires passing the Rx to Vue.use() as the ' + |
| 51 | + 'second argument.', |
| 52 | + this |
| 53 | + ) |
| 54 | + return |
44 | 55 | } |
45 | | - } |
46 | | - |
47 | | - Vue.mixin(mixin) |
48 | 56 |
|
49 | | - Vue.prototype.$watchAsObservable = function (expOrFn, options) { |
50 | 57 | var self = this |
51 | 58 |
|
52 | 59 | var obs$ = Rx.Observable.create(function (observer) { |
|
0 commit comments