function parseDataset (attr) {
|
const dataset = {}
|
|
Object.keys(attr || {}).forEach(key => {
|
if (key.indexOf('data') === 0) {
|
let str = key.replace('data', '')
|
str = str.charAt(0).toLowerCase() + str.slice(1)
|
dataset[str] = attr[key]
|
}
|
})
|
|
return dataset
|
}
|
|
function findAttrs (ids, elm, result) {
|
const nodes = elm.children
|
if (!Array.isArray(nodes)) {
|
return false
|
}
|
for (let i = 0; i < nodes.length; i++) {
|
const node = nodes[i]
|
if (node.attr) {
|
const index = ids.indexOf(node.attr.id)
|
if (index >= 0) {
|
result[index] = {
|
id: ids[index],
|
ref: node.ref,
|
dataset: parseDataset(node.attr)
|
}
|
if (ids.length === 1) {
|
break
|
}
|
}
|
}
|
if (node.children) {
|
findAttrs(ids, node, result)
|
}
|
}
|
}
|
|
function getSelectors (queue) {
|
const ids = []
|
for (let i = 0; i < queue.length; i++) {
|
const selector = queue[i].selector
|
if (selector.indexOf('#') === 0) {
|
ids.push(selector.substring(1))
|
}
|
}
|
return ids
|
}
|
|
function getComponentRectAll (dom, attrs, index, result, callback) {
|
const attr = attrs[index]
|
dom.getComponentRect(attr.ref, option => {
|
option.size.id = attr.id
|
option.size.dataset = attr.dataset
|
result.push(option.size)
|
index += 1
|
if (index < attrs.length) {
|
getComponentRectAll(dom, attrs, index, result, callback)
|
} else {
|
callback(result)
|
}
|
})
|
}
|
|
export function requestComponentInfo (pageVm, queue, callback) {
|
// TODO 重构,逻辑不对,queue 里的每一项可能有单独的作用域查找(即 component)
|
const dom = pageVm._$weex.requireModule('dom')
|
const selectors = getSelectors(queue)
|
const outAttrs = new Array(selectors.length)
|
findAttrs(selectors, pageVm.$el, outAttrs)
|
getComponentRectAll(dom, outAttrs, 0, [], (result) => {
|
callback(result)
|
})
|
}
|