提交 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 {
checkInWindows
} from 'uni-helpers/windows'
import {
getCurrentPageVm
} from '../../platform'
......@@ -14,27 +16,27 @@ const defaultOptions = {
class ServiceIntersectionObserver {
constructor (component, options) {
this.pageId = component.$page.id
this.pageId = component.$page && component.$page.id
this.component = component._$id || component // app-plus 平台传输_$id
this.options = Object.assign({}, defaultOptions, options)
}
}
_makeRootMargin (margins = {}) {
this.options.rootMargin = ['top', 'right', 'bottom', 'left'].map(name => `${Number(margins[name]) || 0}px`).join(
' ')
}
}
relativeTo (selector, margins) {
this.options.relativeToSelector = selector
this._makeRootMargin(margins)
return this
}
}
relativeToViewport (margins) {
this.options.relativeToSelector = null
this._makeRootMargin(margins)
return this
}
}
observe (selector, callback) {
if (typeof callback !== 'function') {
......@@ -48,13 +50,13 @@ class ServiceIntersectionObserver {
reqId: this.reqId,
component: this.component,
options: this.options
}, this.pageId)
}
}, checkInWindows(this.component) ? this.component : this.pageId)
}
disconnect () {
UniServiceJSBridge.publishHandler('destroyComponentObserver', {
reqId: this.reqId
}, this.pageId)
}, checkInWindows(this.component) ? this.component : this.pageId)
}
}
......@@ -67,4 +69,4 @@ export function createIntersectionObserver (context, options) {
return new ServiceIntersectionObserver(context, options)
}
return new ServiceIntersectionObserver(getCurrentPageVm('createIntersectionObserver'), options)
}
}
import createCallbacks from 'uni-helpers/callbacks'
import {
getCurrentPageVm
} from '../../platform'
const createMediaQueryObserverCallbacks = createCallbacks('requestMediaQueryObserver')
class ServiceMediaQueryObserver {
constructor (component, options) {
this.pageId = component.$page.id
this.component = component._$id || component // app-plus 平台传输_$id
this.options = options
}
observe (options, callback) {
if (typeof callback !== 'function') {
return
}
this.options = options
this.reqId = createMediaQueryObserverCallbacks.push(callback)
UniServiceJSBridge.publishHandler('requestMediaQueryObserver', {
reqId: this.reqId,
component: this.component,
options: this.options
}, this.pageId)
}
disconnect () {
UniServiceJSBridge.publishHandler('destroyMediaQueryObserver', {
reqId: this.reqId
}, this.pageId)
}
}
export function createMediaQueryObserver (context, options) {
if (!context._isVue) {
options = context
context = null
}
if (context) {
return new ServiceMediaQueryObserver(context, options)
}
return new ServiceMediaQueryObserver(getCurrentPageVm('createMediaQueryObserver'), options)
}
import createCallbacks from 'uni-helpers/callbacks'
import {
getCurrentPageVm
} from '../../platform'
const createMediaQueryObserverCallbacks = createCallbacks('requestMediaQueryObserver')
class ServiceMediaQueryObserver {
constructor (component, options) {
this.pageId = component.$page && component.$page.id
this.component = component._$id || component // app-plus 平台传输_$id
this.options = options
}
observe (options, callback) {
if (typeof callback !== 'function') {
return
}
this.options = options
this.reqId = createMediaQueryObserverCallbacks.push(callback)
UniServiceJSBridge.publishHandler('requestMediaQueryObserver', {
reqId: this.reqId,
component: this.component,
options: this.options
})
}
disconnect () {
UniServiceJSBridge.publishHandler('destroyMediaQueryObserver', {
reqId: this.reqId
})
}
}
export function createMediaQueryObserver (context, options) {
if (!context._isVue) {
options = context
context = null
}
if (context) {
return new ServiceMediaQueryObserver(context, options)
}
return new ServiceMediaQueryObserver(getCurrentPageVm('createMediaQueryObserver'), options)
}
......@@ -124,16 +124,17 @@ export function requestComponentInfo ({
reqId,
reqs
}, pageId) {
const pages = getCurrentPages() // 跨平台时,View 层也应该实现该方法,举例 App 上,View 层的 getCurrentPages 返回长度为1的当前页面数组
const page = pages.find(page => page.$page.id === pageId)
if (!page) {
throw new Error(`Not Found:Page[${pageId}]`)
let pageVm
if (pageId._isVue) {
pageVm = pageId
} else {
const pages = getCurrentPages() // 跨平台时,View 层也应该实现该方法,举例 App 上,View 层的 getCurrentPages 返回长度为1的当前页面数组
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 = []
reqs.forEach(function ({
component,
......@@ -151,5 +152,5 @@ export function requestComponentInfo ({
UniViewJSBridge.publishHandler('onRequestComponentInfo', {
reqId,
res: result
}, pageId)
})
}
......@@ -26,20 +26,19 @@ export function requestComponentObserver ({
component,
options
}, 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
let pageVm
if (pageId._isVue) {
pageVm = pageId
} else {
const pages = getCurrentPages() // 跨平台时,View 层也应该实现该方法,举例 App 上,View 层的 getCurrentPages 返回长度为1的当前页面数组
const page = pages.find(page => page.$page.id === pageId)
if (!page) {
throw new Error(`Not Found:Page[${pageId}]`)
}
pageVm = page.$vm
}
const $el = findElm(component, pageVm)
const root = options.relativeToSelector ? $el.querySelector(options.relativeToSelector) : null
const intersectionObserver = intersectionObservers[reqId] = new IntersectionObserver((entries, observer) => {
entries.forEach(entrie => {
UniViewJSBridge.publishHandler('onRequestComponentObserver', {
......@@ -53,7 +52,7 @@ export function requestComponentObserver ({
dataset: normalizeDataset(entrie.target.dataset || {}),
id: entrie.target.id
}
}, pageVm.$page.id)
})
})
}, {
root,
......@@ -63,11 +62,20 @@ export function requestComponentObserver ({
if (options.observeAll) {
intersectionObserver.USE_MUTATION_OBSERVER = true
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)
})
} else {
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 ({
}) {
const intersectionObserver = intersectionObservers[reqId]
if (intersectionObserver) {
intersectionObserver.disconnect()
intersectionObserver.disconnect()
delete intersectionObservers[reqId]
UniViewJSBridge.publishHandler('onRequestComponentObserver', {
reqId,
reqEnd: true
})
}
}
}
......@@ -34,15 +34,6 @@ export function requestMediaQueryObserver ({
reqId,
options
}, 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))
......@@ -51,7 +42,7 @@ export function requestMediaQueryObserver ({
UniViewJSBridge.publishHandler('onRequestMediaQueryObserver', {
reqId,
res: e.matches
}, pages[pages.length - 1].$page.id)
})
}
listener(mediaQueryObserver) // 监听前执行一次媒体查询
......
import createCallbacks from 'uni-helpers/callbacks'
import {
checkInWindows
} from 'uni-helpers/windows'
const requestComponentInfoCallbacks = createCallbacks('requestComponentInfo')
......@@ -6,5 +9,5 @@ export function requestComponentInfo (pageVm, queue, callback) {
UniServiceJSBridge.publishHandler('requestComponentInfo', {
reqId: requestComponentInfoCallbacks.push(callback),
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.
先完成此消息的编辑!
想要评论请 注册