提交 2958ea43 编写于 作者: inkwalk's avatar inkwalk

fixed: three losed context apis that dependence ui

上级 dff5003d
const WINDOW_NAMES = ['VUniLeftWindow', 'VUniTopWindow', 'VUniRightWindow']
export function checkInWindows (vm) {
if (__PLATFORM__ !== 'h5') {
return false
}
while (vm) {
if (WINDOW_NAMES.indexOf(vm.$options.name) !== -1) {
return true
}
vm = vm.$parent
}
}
import createCallbacks from 'uni-helpers/callbacks' import createCallbacks from 'uni-helpers/callbacks'
import {
checkInWindows
} from 'uni-helpers/windows'
import { import {
getCurrentPageVm getCurrentPageVm
} from '../../platform' } from '../../platform'
...@@ -14,27 +16,27 @@ const defaultOptions = { ...@@ -14,27 +16,27 @@ const defaultOptions = {
class ServiceIntersectionObserver { class ServiceIntersectionObserver {
constructor (component, options) { constructor (component, options) {
this.pageId = component.$page.id this.pageId = component.$page && component.$page.id
this.component = component._$id || component // app-plus 平台传输_$id this.component = component._$id || component // app-plus 平台传输_$id
this.options = Object.assign({}, defaultOptions, options) this.options = Object.assign({}, defaultOptions, options)
} }
_makeRootMargin (margins = {}) { _makeRootMargin (margins = {}) {
this.options.rootMargin = ['top', 'right', 'bottom', 'left'].map(name => `${Number(margins[name]) || 0}px`).join( this.options.rootMargin = ['top', 'right', 'bottom', 'left'].map(name => `${Number(margins[name]) || 0}px`).join(
' ') ' ')
} }
relativeTo (selector, margins) { relativeTo (selector, margins) {
this.options.relativeToSelector = selector this.options.relativeToSelector = selector
this._makeRootMargin(margins) this._makeRootMargin(margins)
return this return this
} }
relativeToViewport (margins) { relativeToViewport (margins) {
this.options.relativeToSelector = null this.options.relativeToSelector = null
this._makeRootMargin(margins) this._makeRootMargin(margins)
return this return this
} }
observe (selector, callback) { observe (selector, callback) {
if (typeof callback !== 'function') { if (typeof callback !== 'function') {
...@@ -48,13 +50,13 @@ class ServiceIntersectionObserver { ...@@ -48,13 +50,13 @@ class ServiceIntersectionObserver {
reqId: this.reqId, reqId: this.reqId,
component: this.component, component: this.component,
options: this.options options: this.options
}, this.pageId) }, checkInWindows(this.component) ? this.component : this.pageId)
} }
disconnect () { disconnect () {
UniServiceJSBridge.publishHandler('destroyComponentObserver', { UniServiceJSBridge.publishHandler('destroyComponentObserver', {
reqId: this.reqId reqId: this.reqId
}, this.pageId) }, checkInWindows(this.component) ? this.component : this.pageId)
} }
} }
...@@ -67,4 +69,4 @@ export function createIntersectionObserver (context, options) { ...@@ -67,4 +69,4 @@ export function createIntersectionObserver (context, options) {
return new ServiceIntersectionObserver(context, options) return new ServiceIntersectionObserver(context, options)
} }
return new ServiceIntersectionObserver(getCurrentPageVm('createIntersectionObserver'), options) return new ServiceIntersectionObserver(getCurrentPageVm('createIntersectionObserver'), options)
} }
import createCallbacks from 'uni-helpers/callbacks' import createCallbacks from 'uni-helpers/callbacks'
import {
import { getCurrentPageVm
getCurrentPageVm } from '../../platform'
} from '../../platform'
const createMediaQueryObserverCallbacks = createCallbacks('requestMediaQueryObserver')
const createMediaQueryObserverCallbacks = createCallbacks('requestMediaQueryObserver')
class ServiceMediaQueryObserver {
class ServiceMediaQueryObserver { constructor (component, options) {
constructor (component, options) { this.pageId = component.$page && component.$page.id
this.pageId = component.$page.id this.component = component._$id || component // app-plus 平台传输_$id
this.component = component._$id || component // app-plus 平台传输_$id this.options = options
this.options = options }
}
observe (options, callback) {
observe (options, callback) { if (typeof callback !== 'function') {
if (typeof callback !== 'function') { return
return }
} this.options = options
this.options = options
this.reqId = createMediaQueryObserverCallbacks.push(callback)
this.reqId = createMediaQueryObserverCallbacks.push(callback)
UniServiceJSBridge.publishHandler('requestMediaQueryObserver', {
UniServiceJSBridge.publishHandler('requestMediaQueryObserver', { reqId: this.reqId,
reqId: this.reqId, component: this.component,
component: this.component, options: this.options
options: this.options })
}, this.pageId) }
}
disconnect () {
disconnect () { UniServiceJSBridge.publishHandler('destroyMediaQueryObserver', {
UniServiceJSBridge.publishHandler('destroyMediaQueryObserver', { reqId: this.reqId
reqId: this.reqId })
}, this.pageId) }
} }
}
export function createMediaQueryObserver (context, options) {
export function createMediaQueryObserver (context, options) { if (!context._isVue) {
if (!context._isVue) { options = context
options = context context = null
context = null }
} if (context) {
if (context) { return new ServiceMediaQueryObserver(context, options)
return new ServiceMediaQueryObserver(context, options) }
} return new ServiceMediaQueryObserver(getCurrentPageVm('createMediaQueryObserver'), options)
return new ServiceMediaQueryObserver(getCurrentPageVm('createMediaQueryObserver'), options) }
}
...@@ -124,16 +124,17 @@ export function requestComponentInfo ({ ...@@ -124,16 +124,17 @@ export function requestComponentInfo ({
reqId, reqId,
reqs reqs
}, pageId) { }, pageId) {
const pages = getCurrentPages() // 跨平台时,View 层也应该实现该方法,举例 App 上,View 层的 getCurrentPages 返回长度为1的当前页面数组 let pageVm
if (pageId._isVue) {
const page = pages.find(page => page.$page.id === pageId) pageVm = pageId
} else {
if (!page) { const pages = getCurrentPages() // 跨平台时,View 层也应该实现该方法,举例 App 上,View 层的 getCurrentPages 返回长度为1的当前页面数组
throw new Error(`Not Found:Page[${pageId}]`) const page = pages.find(page => page.$page.id === pageId)
if (!page) {
throw new Error(`Not Found:Page[${pageId}]`)
}
pageVm = page.$vm
} }
const pageVm = page.$vm
const result = [] const result = []
reqs.forEach(function ({ reqs.forEach(function ({
component, component,
...@@ -151,5 +152,5 @@ export function requestComponentInfo ({ ...@@ -151,5 +152,5 @@ export function requestComponentInfo ({
UniViewJSBridge.publishHandler('onRequestComponentInfo', { UniViewJSBridge.publishHandler('onRequestComponentInfo', {
reqId, reqId,
res: result res: result
}, pageId) })
} }
...@@ -26,20 +26,19 @@ export function requestComponentObserver ({ ...@@ -26,20 +26,19 @@ export function requestComponentObserver ({
component, component,
options options
}, pageId) { }, pageId) {
const pages = getCurrentPages() let pageVm
if (pageId._isVue) {
const page = pages.find(page => page.$page.id === pageId) pageVm = pageId
} else {
if (!page) { const pages = getCurrentPages() // 跨平台时,View 层也应该实现该方法,举例 App 上,View 层的 getCurrentPages 返回长度为1的当前页面数组
throw new Error(`Not Found:Page[${pageId}]`) const page = pages.find(page => page.$page.id === pageId)
} if (!page) {
throw new Error(`Not Found:Page[${pageId}]`)
const pageVm = page.$vm }
pageVm = page.$vm
}
const $el = findElm(component, pageVm) const $el = findElm(component, pageVm)
const root = options.relativeToSelector ? $el.querySelector(options.relativeToSelector) : null const root = options.relativeToSelector ? $el.querySelector(options.relativeToSelector) : null
const intersectionObserver = intersectionObservers[reqId] = new IntersectionObserver((entries, observer) => { const intersectionObserver = intersectionObservers[reqId] = new IntersectionObserver((entries, observer) => {
entries.forEach(entrie => { entries.forEach(entrie => {
UniViewJSBridge.publishHandler('onRequestComponentObserver', { UniViewJSBridge.publishHandler('onRequestComponentObserver', {
...@@ -53,7 +52,7 @@ export function requestComponentObserver ({ ...@@ -53,7 +52,7 @@ export function requestComponentObserver ({
dataset: normalizeDataset(entrie.target.dataset || {}), dataset: normalizeDataset(entrie.target.dataset || {}),
id: entrie.target.id id: entrie.target.id
} }
}, pageVm.$page.id) })
}) })
}, { }, {
root, root,
...@@ -63,11 +62,20 @@ export function requestComponentObserver ({ ...@@ -63,11 +62,20 @@ export function requestComponentObserver ({
if (options.observeAll) { if (options.observeAll) {
intersectionObserver.USE_MUTATION_OBSERVER = true intersectionObserver.USE_MUTATION_OBSERVER = true
Array.prototype.map.call($el.querySelectorAll(options.selector), el => { Array.prototype.map.call($el.querySelectorAll(options.selector), el => {
if (!el) {
console.warn(`Node ${options.selector} is not found. Intersection observer will not trigger.`)
return
}
intersectionObserver.observe(el) intersectionObserver.observe(el)
}) })
} else { } else {
intersectionObserver.USE_MUTATION_OBSERVER = false intersectionObserver.USE_MUTATION_OBSERVER = false
intersectionObserver.observe($el.querySelector(options.selector)) const el = $el.querySelector(options.selector)
if (!el) {
console.warn(`Node ${options.selector} is not found. Intersection observer will not trigger.`)
return
}
intersectionObserver.observe(el)
} }
} }
...@@ -76,11 +84,11 @@ export function destroyComponentObserver ({ ...@@ -76,11 +84,11 @@ export function destroyComponentObserver ({
}) { }) {
const intersectionObserver = intersectionObservers[reqId] const intersectionObserver = intersectionObservers[reqId]
if (intersectionObserver) { if (intersectionObserver) {
intersectionObserver.disconnect() intersectionObserver.disconnect()
delete intersectionObservers[reqId] delete intersectionObservers[reqId]
UniViewJSBridge.publishHandler('onRequestComponentObserver', { UniViewJSBridge.publishHandler('onRequestComponentObserver', {
reqId, reqId,
reqEnd: true reqEnd: true
}) })
} }
} }
...@@ -34,15 +34,6 @@ export function requestMediaQueryObserver ({ ...@@ -34,15 +34,6 @@ export function requestMediaQueryObserver ({
reqId, reqId,
options options
}, pageId) { }, pageId) {
const pages = getCurrentPages()
const page = pages.find(page => page.$page.id === pageId)
if (!page) {
throw new Error(`Not Found:Page[${pageId}]`)
}
// const pageVm = page.$vm
// 创建一个媒体查询对象 // 创建一个媒体查询对象
const mediaQueryObserver = mediaQueryObservers[reqId] = window.matchMedia(handleMediaQueryStr(options)) const mediaQueryObserver = mediaQueryObservers[reqId] = window.matchMedia(handleMediaQueryStr(options))
...@@ -51,7 +42,7 @@ export function requestMediaQueryObserver ({ ...@@ -51,7 +42,7 @@ export function requestMediaQueryObserver ({
UniViewJSBridge.publishHandler('onRequestMediaQueryObserver', { UniViewJSBridge.publishHandler('onRequestMediaQueryObserver', {
reqId, reqId,
res: e.matches res: e.matches
}, pages[pages.length - 1].$page.id) })
} }
listener(mediaQueryObserver) // 监听前执行一次媒体查询 listener(mediaQueryObserver) // 监听前执行一次媒体查询
......
import createCallbacks from 'uni-helpers/callbacks' import createCallbacks from 'uni-helpers/callbacks'
import {
checkInWindows
} from 'uni-helpers/windows'
const requestComponentInfoCallbacks = createCallbacks('requestComponentInfo') const requestComponentInfoCallbacks = createCallbacks('requestComponentInfo')
...@@ -6,5 +9,5 @@ export function requestComponentInfo (pageVm, queue, callback) { ...@@ -6,5 +9,5 @@ export function requestComponentInfo (pageVm, queue, callback) {
UniServiceJSBridge.publishHandler('requestComponentInfo', { UniServiceJSBridge.publishHandler('requestComponentInfo', {
reqId: requestComponentInfoCallbacks.push(callback), reqId: requestComponentInfoCallbacks.push(callback),
reqs: queue reqs: queue
}, pageVm.$page.id) }, checkInWindows(pageVm) ? pageVm : pageVm.$page.id)
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册