Add most of components and prepare for V1 Release
This commit is contained in:
74
src/utils/bindProps.js
Normal file
74
src/utils/bindProps.js
Normal file
@@ -0,0 +1,74 @@
|
||||
import WatchPrimitiveProperties from '../utils/WatchPrimitiveProperties'
|
||||
|
||||
function capitalizeFirstLetter (string) {
|
||||
return string.charAt(0).toUpperCase() + string.slice(1)
|
||||
}
|
||||
|
||||
export function getPropsValues (vueInst, props) {
|
||||
return Object.keys(props)
|
||||
.reduce(
|
||||
(acc, prop) => {
|
||||
if (vueInst[prop] !== undefined) {
|
||||
acc[prop] = vueInst[prop]
|
||||
}
|
||||
return acc
|
||||
},
|
||||
{}
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Binds the properties defined in props to the google maps instance.
|
||||
* If the prop is an Object type, and we wish to track the properties
|
||||
* of the object (e.g. the lat and lng of a LatLng), then we do a deep
|
||||
* watch. For deep watch, we also prevent the _changed event from being
|
||||
* $emitted if the data source was external.
|
||||
*/
|
||||
export function bindProps (vueInst, googleMapsInst, props, options) {
|
||||
for (let attribute in props) {
|
||||
let {twoWay, type, trackProperties, noBind} = props[attribute]
|
||||
|
||||
if (noBind) continue
|
||||
|
||||
const setMethodName = 'set' + capitalizeFirstLetter(attribute)
|
||||
const getMethodName = 'get' + capitalizeFirstLetter(attribute)
|
||||
const eventName = attribute.toLowerCase() + '_changed'
|
||||
const initialValue = vueInst[attribute]
|
||||
|
||||
if (typeof googleMapsInst[setMethodName] === 'undefined') {
|
||||
throw new Error(`${setMethodName} is not a method of (the Maps object corresponding to) ${vueInst.$options._componentTag}`)
|
||||
}
|
||||
|
||||
// We need to avoid an endless
|
||||
// propChanged -> event $emitted -> propChanged -> event $emitted loop
|
||||
// although this may really be the user's responsibility
|
||||
if (type !== Object || !trackProperties) {
|
||||
// Track the object deeply
|
||||
vueInst.$watch(attribute, () => {
|
||||
const attributeValue = vueInst[attribute]
|
||||
|
||||
googleMapsInst[setMethodName](attributeValue)
|
||||
}, {
|
||||
immediate: typeof initialValue !== 'undefined',
|
||||
deep: type === Object
|
||||
})
|
||||
} else {
|
||||
WatchPrimitiveProperties(
|
||||
vueInst,
|
||||
trackProperties.map(prop => `${attribute}.${prop}`),
|
||||
() => {
|
||||
googleMapsInst[setMethodName](vueInst[attribute])
|
||||
},
|
||||
vueInst[attribute] !== undefined
|
||||
)
|
||||
}
|
||||
|
||||
if (twoWay &&
|
||||
(vueInst.$gmapOptions.autobindAllEvents ||
|
||||
vueInst.$attrs[eventName])) {
|
||||
googleMapsInst.addListener(eventName, (ev) => { // eslint-disable-line no-unused-vars
|
||||
vueInst.$emit(eventName, googleMapsInst[getMethodName]())
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user