Skip to content

Commit f723d42

Browse files
committed
feat(frame): fire frame events from the frame wrapper
1 parent f3bfe5f commit f723d42

File tree

3 files changed

+101
-13
lines changed

3 files changed

+101
-13
lines changed
Lines changed: 35 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,3 @@
1-
import Vue from '../../framework'
2-
//const Frame = require('tns-core-modules/ui/frame').Frame
3-
41
export default {
52
name: 'frame',
63
created() {
@@ -18,27 +15,54 @@ export default {
1815
},
1916
methods: {
2017
_getFrame() {
21-
return this.$el.nativeView // as Frame
18+
return this.$el.nativeView
2219
},
2320

2421
notifyPageMounted(pageVm) {
2522
this.$nextTick(() => {
26-
console.log('notifyPageMounted')
2723
this.navigate({
2824
create: _ => pageVm.$el.nativeView
2925
})
3026
})
3127
},
3228

33-
goBack() {
34-
this._getFrame()
35-
},
36-
navigate(entry) {
29+
navigate(entry, back = false) {
3730
const frame = this._getFrame()
3831

39-
console.log(frame.backStack)
32+
if (back) {
33+
return frame.goBack(entry)
34+
}
35+
36+
entry.clearHistory && this.$emit('beforeReplace', entry)
37+
!entry.clearHistory && this.$emit('beforePush', entry)
38+
39+
// resolve the page from the entry and attach a navigatedTo listener
40+
// to fire the frame events
41+
const page = entry.create()
42+
page.once('navigatedTo', () => {
43+
entry.clearHistory && this.$emit('replace', entry)
44+
!entry.clearHistory && this.$emit('push', entry)
45+
})
46+
page.on('navigatedFrom', ({ isBackNavigation }) => {
47+
if (isBackNavigation) {
48+
page.off('navigatedFrom')
49+
this.$emit('back', entry)
50+
}
51+
})
52+
entry.create = () => page
4053
frame.navigate(entry)
41-
console.log(frame.backStack)
54+
},
55+
56+
back(backstackEntry = null) {
57+
this.navigate(backstackEntry, true)
58+
},
59+
push(entry) {
60+
this.navigate(entry)
61+
},
62+
replace(entry) {
63+
entry.clearHistory = true
64+
65+
this.navigate(entry)
4266
}
4367
}
4468
}

platform/nativescript/runtime/components/page.js

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,25 @@ export default {
1111
)
1212
},
1313
mounted() {
14-
this._findParentFrame().notifyPageMounted(this)
14+
const frame = this._findParentFrame()
15+
if (frame) {
16+
frame.notifyPageMounted(this)
17+
}
18+
19+
this.$nextTick(() => {
20+
const handler = e => {
21+
if (e.isBackNavigation) {
22+
this.$el.nativeView.off('navigatedFrom', handler)
23+
this.$destroy()
24+
}
25+
}
26+
this.$el.nativeView.on('navigatedFrom', handler)
27+
})
1528
},
1629
methods: {
1730
_findParentFrame() {
1831
let parentFrame = this.$parent
19-
while (parentFrame.$options.name !== 'frame') {
32+
while (parentFrame && parentFrame.$options.name !== 'frame') {
2033
parentFrame = parentFrame.$parent
2134
}
2235

samples/app/app-with-frame.js

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
const Vue = require('./nativescript-vue')
2+
3+
Vue.config.silent = false
4+
Vue.config.debug = true
5+
6+
const createPage = title =>
7+
new Vue({
8+
template: `<Page><Foo/></Page>`,
9+
components: {
10+
Foo: {
11+
template: `<Label text="${title}"/>`,
12+
created() {
13+
this.intv = setInterval(
14+
() => console.log(`[${title}] INTERVAL FIRED.`),
15+
1000
16+
)
17+
},
18+
destroyed() {
19+
clearInterval(this.intv)
20+
}
21+
}
22+
}
23+
}).$mount().$el.nativeView
24+
25+
new Vue({
26+
template: `
27+
<Frame ref="frame"
28+
@beforePush="log('beforePush')"
29+
@beforeReplace="log('beforeReplace')"
30+
@beforeBack="log('beforeBack')"
31+
@push="log('push')"
32+
@replace="log('replace')"
33+
@back="log('back')"
34+
>
35+
<Page><Button text="Page" @tap="replace" /></Page>
36+
</Frame>
37+
`,
38+
39+
methods: {
40+
replace() {
41+
this.$refs.frame.push({
42+
create() {
43+
return createPage('test')
44+
}
45+
})
46+
},
47+
log(name) {
48+
console.log('FRAME EVENT: ' + name)
49+
}
50+
}
51+
}).$start()

0 commit comments

Comments
 (0)