JS_Print

实现JS打印功能

技术选择

Lodop:如果是免费版本,使用直接打印(LODOP.PRINT();)底部会出现本页由【试用版打印控件Lodop6.2.2.4】输出字样。

微信小程序开发记录

数据传递

JS向wxml传递数据

案例1

JS

this.setData({
    'key': {a: 1},
});

wxml

<!-- 显示1 -->
<text>{{key.a}}</text>

案例2

JS

this.setData({
    'key': {a: 1},
});

wxml1

<import src="wxml2 path" />
<template is="wxml2 name" data="{{...key}}"/>

wxml2(wxml2被import进wxml1中,并且wxml1通过扩展运算符将数据传递给wxml2)

<!-- 显示1,由此可见扩展运算符的好处就是省略了`key.`符号 -->
<text>{{a}}</text>

wxml向JS传递数据

案例1

wxml

<view bindtap='click' data-item='{{item}}'></view>

JS

click(e) {
    let item = e.currentTarget.dataset.item;
    //item就是传递的数据
}

FAQ

margin对第二行失效?

<text class="title">{{title}}</text>
.title{margin: 0 10px;}

使用上述方式,会发现当title因过长而换行时,第二行的外边距没有生效,可以为其设置display:block;解决。

修改Jar内容

例子

最近线上报了一个java.lang.UnsatisfiedLinkError的错误,发现环信内部没有将某个loadLibrary方法try catch(error),但是其内部的_loadLibrary方法是try catch(error)的,所以准备做以下修改:
hyphenatechat_3.4.2.jar中的EMClient.class文件中的loadLibrary方法做以下替换:

private static void loadLibrary() {
    if (!libraryLoaded) {
        _loadLibrary("sqlite");
        _loadLibrary("hyphenate_av");
        _loadLibrary("hyphenate_av_recorder");
        System.loadLibrary("hyphenate");
        libraryLoaded = true;
    }

}

替换为

private static void loadLibrary() {
    if (!libraryLoaded) {
        _loadLibrary("sqlite");
        _loadLibrary("hyphenate_av");
        _loadLibrary("hyphenate_av_recorder");
        _loadLibrary("hyphenate");
        libraryLoaded = true;
    }

}

环境

Windows

需要下载内容

- 阅读剩余部分 -

Vue 使用History记录上一页面的数据

前提

Vue-Router mode='history'才可用,已通过localstorage实现第二套方案,主要是存储两个key:数据key和path#pagekey实现。

UI

列表页

详情页

需求

  1. 从列表页的第二页进入详情页,返回时列表页仍然显示在第二页;
  2. 从列表页的第二页进入详情页,返回时列表页的筛选条件仍然存在。

- 阅读剩余部分 -

ViewModel源码分析

知识点

  1. ViewModelProviders:ViewModelProvider的工厂方法。
  2. ViewModelProvider:工具类,通过反射的方式创建ViewModel。
  3. AndroidViewModelFactory:ViewModelProvider的静态内部类 ,全局单例只有一个 ,用于实现反射创建ViewModel。
  4. ViewModelStores:ViewModelStore的工厂方法类。
  5. ViewModelStore:使用HashMap存储ViewModel,key为:“DEFAULT_KEY + ":" + canonicalName”。
  6. HolderFragment:系统为你的Activity添加一个具有提供ViewModelStore的Fragment,并且因为这个Fragment调用了setRetainInstance(true),所以它能够跨越activity的生命周期。

使用

ViewModelProviders.of(getActivity()).get(MainViewModel.class);

- 阅读剩余部分 -