【问题标题】:RactiveJS adding subcomponent on the flyRactiveJS 即时添加子组件
【发布时间】:2015-08-17 15:14:25
【问题描述】:

我在使用 Ractive 动态添加子组件时遇到了一些问题。

我正在制作日程安排/日历组件,并通过选择一天的时间间隔来添加新的活动/会议。这就是为什么我需要动态添加子组件。

现在我做这样的事情:

this.on('addEvent', function () {
  new CalendarEvent({
    el: evt.node
  });
});

这会将组件添加到位,但它不会被识别为子组件,例如点击事件也在“父”组件上触发。这很好(-ish),因为我可以破解一个刚刚返回 false 的 on-click=cancelEvents 虚拟监听器(从而防止冒泡)。不是一个漂亮的解决方案,但它确实有效。

但在我的子组件中,我需要知道父组件的高度,但 this.parentnull,这是一个更大的问题。

我还尝试将组件与renderinsert 一起放置,但我无法让它工作。

是否有一种理智的方式可以即时添加子组件但仍保持父/子关系?

提前致谢!

附言

这是一个 JS-fiddle,展示了我的期望与实际行为是什么! http://jsfiddle.net/noakcjws/1/

【问题讨论】:

    标签: javascript ractivejs


    【解决方案1】:

    以尊重父子关系的方式创建组件的唯一真正方法是使用数据绑定(跳到“运行代码 sn-p”然后点击“整页”...):

    var ractive = new Ractive({
      el: 'main',
      template: '#template',
      data: {
        days: 'monday tuesday wednesday thursday friday'.split( ' ' ).map( function ( name ) {
          return { name: name, intervals: makeIntervals() };
        })
      },
      addEvent: function ( day, interval ) {
        this.set( 'days[' + day + '].intervals[' + interval + '].event', {
          description: 'i am a calendar event'
        });
      }
    });
    
    Ractive.components.CalendarEvent = Ractive.extend({
      template: '#calendar-event'
    });
    
    function makeIntervals () {
      var intervals = [];
      for ( var i = 9; i < 17; i += 1 ) {
        intervals.push({ start: i, end: i + 1, event: null });
      }
      return intervals;
    }
    body, html, main {
      width: 100%;
      height: 100%;
      padding: 0;
      margin: 0;
    }
    
    .day {
      position: relative;
      float: left;
      width: 20%;
      height: 100%;
      padding: 4em 0 0 0;
      border-right: 2px solid #aaa;
      box-sizing: border-box;
    }
    
    h2 {
      position: absolute;
      top: 0;
      left: 0;
    }
    
    .interval {
      position: relative;
      width: 100%;
      height: 12.5%; /* 100/8 */
      border-bottom: 1px solid #eee;
      box-sizing: border-box;
    }
    
    time {
      position: absolute;
      top: 0.5em;
      left: 0.5em;
      color: #eee;
    }
    
    .event {
      position: absolute;
      width: 100%;
      height: 100%;
      background-color: orange;
      color: white;
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/ractive/0.7.3/ractive.min.js"></script>
    <main></main>
    
    <script type='text/html' id='template'>
      {{#each days :d}}
        <div class='day'>
          <h2>{{name}}</h2>
          
          {{#each intervals :i}}
            <div class='interval' on-click='addEvent(d,i)'>
              <time>{{start}}:00</time>
              {{#if event}}
                <CalendarEvent event='{{event}}'/>
              {{/if}}
            </div>
          {{/each}}
        </div>
      {{/each}}
    </script>
    
    <script type='text/html' id='calendar-event'>
      <div class='event'>
        <p>{{event.description}}</p>
      </div>
    </script>

    显然,这省略了跨越 x 个间隔的事件以及调度冲突等的大量复杂性,但无论您采用哪种方法,它们都会突然出现!

    【讨论】:

    • 嘿,丰富!感谢您的回复!我知道你在做什么,但我不确定这是否会在我的情况下削减它。一旦我再次可以访问代码,我将尝试为我的案例实现类似的东西。没有办法将父级传递给子级以进行 ractive 注册吗?
    • 不,没有。如果证明有必要,可能可以添加该功能(明确通过parentmappings) - 如果您发现没有其他实用方法可以实现您的需求,请随时在 GitHub 上提出问题!
    猜你喜欢
    • 2015-04-25
    • 2016-03-09
    • 2016-02-02
    • 2014-05-29
    • 1970-01-01
    • 2014-02-11
    • 1970-01-01
    • 2010-12-13
    • 2014-12-06
    相关资源
    最近更新 更多