DoneJS StealJS jQuery++ FuncUnit DocumentJS
4.3.0
5.0.0 3.13.1 2.3.35
  • About
  • Guides
  • API Docs
  • Community
  • Contributing
  • Bitovi
    • Bitovi.com
    • Blog
    • Design
    • Development
    • Training
    • Open Source
    • About
    • Contact Us
  • About
  • Guides
  • API Docs
    • Observables
      • can-bind
      • can-compute
      • can-debug
      • can-define
      • can-define/list/list
      • can-define/map/map
      • can-define-backup
      • can-define-stream
      • can-define-stream-kefir
      • can-event-queue
      • can-kefir
      • can-list
      • can-map
      • can-map-define
      • can-observation
      • can-observation-recorder
      • can-observe
      • can-simple-map
      • can-simple-observable
      • can-stream
      • can-stream-kefir
      • can-value
    • Data Modeling
      • can-connect
      • can-connect-feathers
      • can-fixture
      • can-fixture-socket
      • can-ndjson-stream
      • can-set
    • Views
      • can-component
        • static
          • extend
        • prototype
          • ViewModel
          • events
          • helpers
          • leakScope
          • tag
          • view
          • viewModel
        • elements
          • <can-slot>
          • <can-template>
          • <content>
        • lifecycle hooks
          • connectedCallback
        • special events
          • beforeremove
      • can-stache
      • can-stache-bindings
      • can-stache-converters
      • can-stache-route-helpers
      • can-view-autorender
      • can-view-callbacks
      • can-view-import
      • can-view-live
      • can-view-model
      • can-view-nodelist
      • can-view-parser
      • can-view-scope
      • can-view-target
      • react-view-model
      • react-view-model/component
      • steal-stache
    • Routing
      • can-deparam
      • can-param
      • can-route
      • can-route-hash
      • can-route-mock
      • can-route-pushstate
    • JS Utilities
      • can-assign
      • can-define-lazy-value
      • can-diff
      • can-globals
      • can-join-uris
      • can-key
      • can-key-tree
      • can-make-map
      • can-parse-uri
      • can-queues
      • can-string
      • can-string-to-any
      • can-util
      • can-zone
      • can-zone-storage
    • DOM Utilities
      • can-ajax
      • can-attribute-encoder
      • can-child-nodes
      • can-control
      • can-dom-data
      • can-dom-events
      • can-dom-mutate
      • can-event-dom-enter
      • can-event-dom-radiochange
      • can-fragment
    • Data Validation
      • can-define-validate-validatejs
      • can-validate
      • can-validate-interface
      • can-validate-legacy
      • can-validate-validatejs
    • Typed Data
      • can-cid
      • can-construct
      • can-construct-super
      • can-data-types
      • can-namespace
      • can-reflect
      • can-reflect-dependencies
      • can-reflect-promise
      • can-types
    • Polyfills
      • can-symbol
      • can-vdom
    • Core
    • Infrastructure
      • can-global
      • can-test-helpers
    • Ecosystem
    • Legacy
  • Community
  • Contributing
  • GitHub
  • Twitter
  • Chat
  • Forum
  • News
Bitovi

leakScope

  • Edit on GitHub

Allow reading the outer scope values from a component’s view and a component’s viewModel values in the user content.

Boolean

false limits reading to:

  • the component’s viewModel from the component’s view, and
  • the outer scope values from the user content.

true adds the ability to read:

  • the outer scope values from the component’s view, and
  • the component’s ViewModel values from the user content.

The default value is false.

To change leakScope from the default:

import Component from "can-component";

Component.extend( {
    tag: "my-component",
    leakScope: true,
    ViewModel: { message: { default: "Hello World!" } },
    view: "{{message}}"
} );

Leaving leakScope as the default false is useful for hiding and protecting internal details of Component, potentially preventing accidental clashes. It can be helpful to set it to true if you, for example, wanted to customize user content based on some value in the component’s ViewModel.

Use

A component’s leakScope option controls if a component’s view can access the component’s outer scope and the user content can read the component’s view model.

Let’s define what outer scope, component’s view and user content mean.

If I have a <hello-world> component in a view like:

{{#data}}
    <hello-world>{{subject}}</hello-world>
{{/data}}

The outer scope of <hello-world> has data as its context. The user content of <hello-world> is the view between its tags. In this case, the user content is {{subject}}.

Finally, if <hello-world> is defined like:

Component.extend( {
    tag: "hello-world",
    view: "{{greeting}} <content/>{{exclamation}}"
} );

{{greeting}} <content/>{{exclamation}} represents the component’s view.

Using outer scope in component view

If leakScope is true, the component’s view can read the data in the outer scope and will find name: "John" in the following example:

Component.extend( {
    tag: "hello-world",
    leakScope: true, // changed to true instead of the default value
    view: "Hello {{scope.find('name')}}"
} );

With this data in the outer scope:

{ name: "John" }

And used like so:

<hello-world />

If leakScope is true it will render:

<hello-world>Hello John</hello-world>

If leakScope is false it will render:

<hello-world>Hello </hello-world>

Play with this example on JS Bin.

Using viewModel in user content

if leakScope is true, the user content is able to see the name property on the component’s viewModel instance in the following example. Else, name won't be seen.

If the following component is defined:

Component.extend( {
    tag: "hello-world",
    leakScope: true, // changed to true instead of the default value
    ViewModel: { name: { default: "World" } },
    view: "Hello <content />"
} );

With this data in the outer scope:

{ name: "John" }

And used like so:

<hello-world>{{name}}</hello-world>

If leakScope is true it will render:

<hello-world>Hello World</hello-world>

If leakScope is false it will render:

<hello-world>Hello John</hello-world>

Play with this example on JS Bin.

CanJS is part of DoneJS. Created and maintained by the core DoneJS team and Bitovi. Currently 4.3.0.

On this page

Get help

  • Chat with us
  • File an issue
  • Ask questions
  • Read latest news