【问题标题】:Porting angular directives to aurelia将角度指令移植到 aurelia
【发布时间】:2016-07-21 07:43:31
【问题描述】:

我正在创建一个 aurelia 应用程序,并且最近购买了一个使用 angular 的模板。

该模板有大量用于 jquery/js 帮助器的指令,用于它的页面和 html 元素。

刚开始学习 aurelia 我不确定移植这些的正确方法,这是一个示例

.directive('fgLine', function(){
    return {
        restrict: 'C',
        link: function(scope, element) {
            if($('.fg-line')[0]) {
                $('body').on('focus', '.form-control', function(){
                    $(this).closest('.fg-line').addClass('fg-toggled');
                })

                $('body').on('blur', '.form-control', function(){
                    var p = $(this).closest('.form-group');
                    var i = p.find('.form-control').val();

                    if (p.hasClass('fg-float')) {
                        if (i.length == 0) {
                            $(this).closest('.fg-line').removeClass('fg-toggled');
                        }
                    }
                    else {
                        $(this).closest('.fg-line').removeClass('fg-toggled');
                    }
                });
            }

        }
    }

})

该指令针对一个 css 选择器并向其添加事件。

这应该是自定义元素吗?任何人都可以为我指出正确的方向,这应该如何以 aurelia 方式看待?

【问题讨论】:

  • 自定义元素似乎是正确的方向:ilikekillnerds.com/2015/10/…
  • 是的,你可以创建一个customElement并在attached()方法中使用jQuery代码
  • 谢谢大家,那么要使用它,我只需要在我的视图中添加一个指向 js 文件的 require 吗?

标签: aurelia


【解决方案1】:

这应该可以解决问题,尽管this 可能存在一些需要纠正的范围问题。

fgLineCustomElement.js

import { inject } from 'aurelia-framework';

@inject(Element)
export class FgLineCustomElement {

    constructor(element) {
        this.element = $(element);
    }

    attached() {
        $('body').on('focus', '.form-control', function(){
            $(this).closest('.fg-line').addClass('fg-toggled');
        })

        // a more es6-ish approach
        // $('body').on('focus', '.form-control', () => {
        //     this.element.closest('.fg-line').addClass('fg-toggled');
        // });

        $('body').on('blur', '.form-control', function(){
            var p = $(this).closest('.form-group');
            var i = p.find('.form-control').val();

            if (p.hasClass('fg-float')) {
                if (i.length == 0) {
                    $(this).closest('.fg-line').removeClass('fg-toggled');
                }
            }
            else {
                $(this).closest('.fg-line').removeClass('fg-toggled');
            }
        });
    }
}

app.html

<template>
    <require from="fgLineCustomElement"></require>
    <fg-line></fg-line>
</template>

【讨论】:

  • 需要.offdetached 上的事件处理程序以避免内存泄漏。事件也附加到 body 元素,所以不确定为什么要在这里使用自定义元素。
  • 这可能与我对角度指令的理解有关,指令不是自定义元素吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-05
  • 2015-03-03
  • 2010-09-09
相关资源
最近更新 更多