javascript Superfineを使用したMVCの例ref:https://qiita.com/tom-u/items/5fef560a906e105fdaa5

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了javascript Superfineを使用したMVCの例ref:https://qiita.com/tom-u/items/5fef560a906e105fdaa5相关的知识,希望对你有一定的参考价值。

import { h } from './fineapple.js';
import * as Counter from './counter.js';


const app = new Counter.Controllers(new Counter.Model(), document.body, app =>
  h('div', {}, [
    h('h1', {}, 'Fineapple: for building web app.'),
    h('div', {class:'counter'}, [
      h('h2', {}, app.model.count),
      h('button', { onclick: () => app.sub().info('sub',app.model) }, '-'),
      h('button', { onclick: () => app.add().info('add',app.model) }, '+'),
    ]),
  ])
);

app.launch().info('launch');


// const c = new Counter.Components();
//
// new Counter.Controllers(new Counter.Model(), document.body, app =>
//   h('div', {}, [
//     h('h1', {}, 'Fineapple: for building web app.'),
//     h('div', {class:'counter'}, [
//       c.display(app),
//       c.subButton(app),
//       c.addButton(app),
//     ]),
//   ])
// )
// .launch().info('launch');


// new Counter.Controllers(new Counter.Model(), document.body, Counter.view()).launch();
import { h, Fineapple } from './fineapple.js';

export class Model {
  constructor(count=0) { this.count=count; }
  add(by=1) { this.count+=by; return this; }
  sub(by=1) { this.count-=by; return this; }
}

export class Controllers extends Fineapple {
  add() {
    this.model.add();
    return this.view.render();
  }
  sub() {
    this.model.sub();
    return this.view.render();
  }
}

export class Components {
  display(app, attributes) {
    return h('h2', attributes, app.model.count);
  }

  addButton(app, attributes, children='+') {
    let handlers = {
      onclick: () => app.add(),
    }
    let properties = Object.assign(handlers, attributes);
    return h('button', properties, children);
  }

  subButton(app, attributes, children='-') {
    let handlers = {
      onclick: () => app.sub(),
    }
    let properties = Object.assign(handlers, attributes);
    return h('button', properties, children);
  }
}

export function view() {
  let c = new Components();
  return app => 
    h('div', {class:'counter'}, [
      c.display(app),
      c.subButton(app),
      c.addButton(app),
    ])
}
import * as superfine from 'https://unpkg.com/superfine?module';

// MVC概要
// 
// app = Controllers(Model,View)
// 
// Model       : アプリの概念。プラットフォーム入出力のないオブジェクト。
// View        : アプリのGUI。ビューの描画を計算する。
// Controllers : アプリの型。メソッドがアプリの制御機能。
// app         : アプリの実体。Controllersのインスタンス。

class Controllers {
  // アプリに必須な属性を設定・保持・管理。
  constructor(model, container, calculator) {
    this.model = model;
    this.view = {
      container: container,
      calculator: calculator,
    };
  }
  // superfineのマウントポイント設定。ビューレンダー(this.view.render)が生成される。
  mount(node) {
    let v = this.view;
    v.node = node;
    v.render = () => {
      v.node = superfine.patch(v.node, v.calculator(this), v.container);
      return this;
    }
    return this;
  }
  // マウントポイント設定とビュー描画の一連の流れ。
  launch() {
    return this.mount().view.render();
  }
  // おまけ。デバッグに便利なようメソッドチェーンで書ける。
  info() {
    console.info(...arguments, this);
    return this;
  }
}

// エクスポート時のユニーク名。
export const Fineapple = Controllers;

// リサイクルエクスポート。
export const h = superfine.h;

// htmlタグのclass属性をJavaScript表現したものを文字列へ変換するユーティリティ。
export const classJoin = o => o.join(' ');
export const classConcat = (a, b) => a.split(' ').concat(b).join(' ');

// htmlタグのstyle属性をJavaScript表現したものを文字列へ変換するユーティリティ。
export const styleJoin = o => Object.keys(o).map(key=>`${key}:${o[key]};`).join('');
export const styleConcat = (a, b) => a + styleJoin(b);

// var foo = ['aaa','bbb']
// var bar = ['ccc','ddd']
// console.assert(classJoin(foo) === 'aaa bbb')
// console.assert(classConcat(classJoin(foo), bar) === 'aaa bbb ccc ddd')

// var foo = {a:'aaa', b:'bbb'}
// var bar = {c:'ccc', d:'ddd'}
// console.assert(styleJoin(foo) === 'a:aaa;b:bbb;')
// console.assert(styleConcat(styleJoin(foo), bar) === 'a:aaa;b:bbb;c:ccc;d:ddd;')

// var foo = {border:'1px solid red', 'font-size':'2em'}
// console.assert(styleJoin(foo) === 'border:1px solid red;font-size:2em;')

以上是关于javascript Superfineを使用したMVCの例ref:https://qiita.com/tom-u/items/5fef560a906e105fdaa5的主要内容,如果未能解决你的问题,请参考以下文章

javascript D3.jsで分散情节をburshし,スタイル変更と同时に选択したオブジェクトを操作する方法。

javascript [日付加算]日付に时间を加算した日付を返します。加算する値を省略すると,日付単位で加算します。

javascript [日付の差を计算]第二引数の日付から第一引数の日付を引いた差を数値で返します。差の単位を省略した场合は差を日付単位で返します。

javascript Vue.jsでEventBusを利用して别にマウントしたコンポーネントやjQueryからイベントを受け取るref:https://qiita.com/inuscript/item

Apex スケジューラを使用したジョブのスケジュール

markdown 服务を通知とともに开始したときの通知を更新する