12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- const utils = require('../../api/utils')
- const { browserPath } = utils
- const posix = browserPath()
- function processRelationPath(self, relation) {
- const from = self.is; let
- to = relation
- if (to[0] === '.') {
- to = `../${to}`
- }
- const _p = posix.join(from, to)
- return _p
- }
- function _relationNode(node, info) {
- const { relationInfo, relation, _p } = info
- // 触发父级组件的 relations
- const type = relationInfo.type
- let parentType = ''
- if (type === 'parent') {
- parentType = 'child'
- } else if (type === 'ancestor') {
- parentType = 'descendant'
- }
- const parentCtx = node.$self
- const childCtx = this
- if (typeof parentCtx.props.theRelations === 'object') {
- Object.keys(parentCtx.props.theRelations)
- .forEach((_relation) => {
- const _relationInfo = parentCtx.props.theRelations[_relation]
- if (_relationInfo.type === parentType) {
- _relationNode.call(parentCtx, childCtx.$node, {
- relationInfo: _relationInfo,
- relation: _relation,
- _p: processRelationPath(parentCtx, _relation),
- })
- return true
- }
- })
- }
-
- node = node.$self
-
- this._storeRelationNodes = this._storeRelationNodes || {}
- if (this._storeRelationNodes[_p]) {
- this._storeRelationNodes[_p].push(node)
- } else {
- this._storeRelationNodes[_p] = [node]
- }
-
- if (this._storeRelationNodes[relation]) {
- this._storeRelationNodes[relation].push(node)
- } else {
- this._storeRelationNodes[relation] = [node]
- }
- const ctx = this || {}
- this.getRelationNodes = function(__p) {
- this._storeRelationNodes = this._storeRelationNodes || {}
- return this._storeRelationNodes[__p] || []
- }
-
- if (typeof relationInfo.linked === 'function') {
- relationInfo.linked.call(ctx, node)
- }
-
- if (typeof relationInfo.linkChanged === 'function') {
- const self = this
- ctx._lifes = ctx._lifes || {}
- ctx._lifes.didUpdate = ctx._lifes.didUpdate || []
- ctx._lifes.didUpdate.push(() => {
- relationInfo.linkChanged.call(self, node)
- })
- }
- if (typeof relationInfo.unlinked === 'function') {
- const self = this
- ctx._lifes = ctx._lifes || {}
- ctx._lifes.didUnmount = ctx._lifes.didUnmount || []
- ctx._lifes.didUnmount.push(() => {
- relationInfo.unlinked.call(self, node)
- })
- }
- }
- module.exports = _relationNode
|