Komponen web weex tidak boleh dimuatkan pada bahagian Android apabila src ialah pembolehubah.
某草草
某草草 2017-06-05 11:11:08
0
2
855

Apabila saya menggunakan web weex, saya menetapkan src sebagai pembolehubah Di sisi Android, webView tidak boleh dimuatkan dengan jayanya.
kod kami adalah seperti berikut:

    <template>
        <tm-navpage title='{{title}}' listenning_rigth_button_click=true>
            <web id='toomao-web' src='{{src}}' style='width: 750; height: 1206;' onpagefinish='pagefinish'></web>
            <tm-loading if='loading'></tm-loading>
        </tm-navpage>
    </template>


<script>
    data: {
        src: '', // web加载链接
        url: '', // url参数
        userInfo: '',
        title: '',
        loading: true,
        canGoBack: false, // 记录当前webView的加载信息
    },
    created() {
        this.url = decodeURIComponent(getUrlParams(this, 'url'));
    }
</script>

Pelaksanaan web pada Android adalah seperti berikut:

@Deprecated
    public WXWeb(WXSDKInstance instance, WXDomObject dom, WXVContainer parent, String instanceId, boolean isLazy) {
        this(instance,dom,parent,isLazy);
    }

    public WXWeb(WXSDKInstance instance, WXDomObject dom, WXVContainer parent, boolean isLazy) {
        super(instance, dom, parent, isLazy);
        createWebView();
    }

    protected void  createWebView(){
        mWebView = new WXWebView(getContext());
    }

    @Override
    protected View initComponentHostView(@NonNull Context context) {
        mWebView.setOnErrorListener(new IWebView.OnErrorListener() {
            @Override
            public void onError(String type, Object message) {
                fireEvent(type, message);
            }
        });
        mWebView.setOnPageListener(new IWebView.OnPageListener() {
            @Override
            public void onReceivedTitle(String title) {
                if (getDomObject().getEvents().contains(Constants.Event.RECEIVEDTITLE)) {
                    Map<String, Object> params = new HashMap<>();
                    params.put("title", title);
                    fireEvent(Constants.Event.RECEIVEDTITLE, params);
                }
            }

            @Override
            public void onPageStart(String url) {
                if ( getDomObject().getEvents().contains(Constants.Event.PAGESTART)) {
                    Map<String, Object> params = new HashMap<>();
                    params.put("url", url);
                    fireEvent(Constants.Event.PAGESTART, params);
                }
            }

            @Override
            public void onPageFinish(String url, boolean canGoBack, boolean canGoForward) {
                if ( getDomObject().getEvents().contains(Constants.Event.PAGEFINISH)) {
                    Map<String, Object> params = new HashMap<>();
                    params.put("url", url);
                    params.put("canGoBack", canGoBack);
                    params.put("canGoForward", canGoForward);
                    fireEvent(Constants.Event.PAGEFINISH, params);
                }
            }
        });
        return mWebView.getView();
    }

    @Override
    public void destroy() {
        super.destroy();
        getWebView().destroy();
    }

    @Override
    protected boolean setProperty(String key, Object param) {
        switch (key) {
            case Constants.Name.SHOW_LOADING:
                Boolean result = WXUtils.getBoolean(param,null);
                if (result != null)
                    setShowLoading(result);
                return true;
            case Constants.Name.SRC:
                String src = WXUtils.getString(param,null);
                if (src != null)
                    setUrl(src);
                return true;
        }
        return super.setProperty(key,param);
    }

    @WXComponentProp(name = Constants.Name.SHOW_LOADING)
    public void setShowLoading(boolean showLoading) {
        getWebView().setShowLoading(showLoading);
    }

    @WXComponentProp(name = Constants.Name.SRC)
    public void setUrl(String url) {
        if (TextUtils.isEmpty(url) || getHostView() == null) {
            return;
        }
        if (!TextUtils.isEmpty(url)) {
            loadUrl(getInstance().rewriteUri(Uri.parse(url), URIAdapter.WEB).toString());
        }
    }

    public void setAction(String action) {
        if (!TextUtils.isEmpty(action)) {
            if (action.equals(GO_BACK)) {
                goBack();
            } else if (action.equals(GO_FORWARD)) {
                goForward();
            } else if (action.equals(RELOAD)) {
                reload();
            }
        }
    }
    

    private void fireEvent(String type, Object message) {
        if (getDomObject().getEvents().contains(Constants.Event.ERROR)) {
            Map<String, Object> params = new HashMap<>();
            params.put("type", type);
            params.put("errorMsg", message);
            fireEvent(Constants.Event.ERROR, params);
        }
    }

    private void loadUrl(String url) {
        getWebView().loadUrl(url);
    }

    private void reload() {
        getWebView().reload();
    }

    private void goForward() {
        getWebView().goForward();
    }

    private void goBack() {
        getWebView().goBack();
    }

    private IWebView getWebView() {
        return mWebView;
    }

Soalan

Semasa proses penyahpepijatan, saya dapati kaedah setProperty hanya akan dilaksanakan sekali sahaja, iaitu apabila menetapkan, apabila src ditugaskan semula, web tidak akan memuat semula url dan memuatkannya semula. Bertanya bagaimana untuk menyedari bahawa apabila src berubah, web boleh dimuat semula,

Mencuba kaedah refreshData dan mendapati ia tidak akan dipanggil sama ada.

    @Override
    public void refreshData(WXComponent component) {
        super.refreshData(component);
        component.getDomObject().getAttrs();
    }
某草草
某草草

membalas semua(2)
世界只因有你

Saya tiba-tiba merasakan bahawa gaya penulisan anda yang menjadi masalah. . .
src='{{src}}' 改为 :src='src'

为情所困

Atribut

src menerima rentetan Apabila anda perlu menggunakan pembolehubah, sintaks yang sepadan untuk vue ialah v-bind
src='{{src}}' sebenarnya melepasi {{src}} dimasukkan, ia pasti tidak akan dihuraikansrc='{{src}}'实际上是传了一个{{src}}的字符串进去,肯定解析不了
所以要用:src='variable'Jadi gunakan :src='variable'
Danv-bindbukan sahaja menerima pembolehubah, tapi boleh juga tulis ekspresi

Saya telah melihat kod anda Jika onPageFinish anda ialah acara, ia harus terikat kepada v-on, yang bermaksud ia harus ditulis sebagai @onPageFinish

.
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan