-
Notifications
You must be signed in to change notification settings - Fork 6
/
proto.go
92 lines (73 loc) · 3.26 KB
/
proto.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
/*
Copyright 2015 Palm Stone Games, Inc.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package polymer
import (
"strings"
"github.com/gopherjs/gopherjs/js"
)
// Interface represents the interface implemented by all type prototypes
// Any type implementing this interface can be registered with polymer.Register()
// Most of this interface can be implemented by embedded polymer.Proto
// The notable exception to this is TagName, which must always be manually implemented
type Interface interface {
// Created is part of the lifecycle callbacks
// It is called when the element is initially created, before the constructor
// Details can be found at https://www.polymer-project.org/1.0/docs/devguide/registering-elements.html#lifecycle-callbacks
Created()
// Ready is part of the lifecycle callbacks
// The ready callback is called when an element’s local DOM is ready.
// It is called after the element’s template has been stamped and all elements inside the element’s local DOM have been configured
// (with values bound from parents, deserialized attributes, or else default values) and had their ready method called.
// Details can be found at https://www.polymer-project.org/1.0/docs/devguide/registering-elements.html#ready-method
Ready()
// Attached is part of the lifecycle callbacks
// It is called when the element is attached to the DOM
// Details can be found at https://www.polymer-project.org/1.0/docs/devguide/registering-elements.html#lifecycle-callbacks
Attached()
// Detached is part of the lifecycle callbacks
// It is called when the element is detached from the DOM
// Details can be found at https://www.polymer-project.org/1.0/docs/devguide/registering-elements.html#lifecycle-callbacks
Detached()
// Internal utility
data() *Proto
}
// Proto represents a prototype for a polymer type
// it's meant to be embedded by the structures used to implements polymer tags
type Proto struct {
this *js.Object
Element
ready bool
}
func (p *Proto) Extends() string { return "" }
func (p *Proto) Created() {}
func (p *Proto) Ready() {}
func (p *Proto) Attached() {}
func (p *Proto) Detached() {}
func (p *Proto) data() *Proto { return p }
// This returns the underlying js object corresponding to the `this` magic value in javascript
// Unlike Underlying(), this object is not wrapped by Polymer.dom()
func (p *Proto) This() *js.Object { return p.this }
// Notify notifies polymer that a value has changed
func (p *Proto) Notify(paths ...string) {
for _, path := range paths {
refVal := getRefValForPath(lookupProto(p.this), strings.Split(path, "."))
jsObj, _ := encodeRaw(refVal)
p.doNotify(path, jsObj)
}
}
func (p *Proto) doNotify(path string, val interface{}) {
p.this.Call("set", path, val)
}
func (p *Proto) Fire(event string, val interface{}) {
p.this.Call("fire", event, val)
}