Aurelia 试图从 Select2 加载 HTML?

Posted

技术标签:

【中文标题】Aurelia 试图从 Select2 加载 HTML?【英文标题】:Aurelia trying to load HTML from Select2? 【发布时间】:2016-01-31 20:39:45 【问题描述】:

所以我尝试在我的 Aurelia 应用程序中使用 Select2。我使用jspm install select2 安装了Select2,在我的app.html 文件中我需要使用<require from="select2/js/select2.min.js"></require> 的Select2。浏览器可以正常加载缩小的 JS 文件,但由于某种原因它也尝试加载

http://localhost:3003/jspm_packages/github/select2/select2@4.0.0/js/select2.min.html

为什么 Aurelia 试图加载我在 <require> 元素中指定的同一 JS 文件的 HTML 副本?我该如何解决这个问题?

谢谢

【问题讨论】:

【参考方案1】:

<require from="...."></require> 的目的是将视图资源导入到您的视图中。查看资源是诸如自定义元素或自定义属性之类的东西。当您将<require from="select2/js/select2.min.js"></require> 添加到模板时,aurelia 会加载模块并认为它是自定义元素的视图模型。然后它会尝试为其加载视图,这就是为什么您会看到尝试加载 .../select2.min.html

集成 select2 的“aurelia 方式”是创建一个将 select2 应用于元素的自定义属性。像这样的:

select2-custom-attribute.js

import customAttribute, inject from 'aurelia-framework';
import DOM from 'aurelia-pal';
import $ from 'jquery';
import 'select2'; // install the select2 jquery plugin
import 'select2/css/select2.min.css!' // ensure the select2 stylesheet has been loaded

@customAttribute('select2')
@inject(Element)
export class Select2CustomAttribute 
  constructor(element) 
    this.element = element;
  

  attached() 
    $(this.element)
     .select2(this.value);
     //.on('change', () => this.element.dispatchEvent(DOM.createCustomEvent('change')));
  

  detached() 
    $(this.element).select2('destroy');
  

然后您将自定义属性导入您的视图并像这样使用它:

app.html

  <require from="select2-custom-attribute"></require>

  <select select2 value.bind="selectedState">
    <option repeat.for="state of states" model.bind="state">$state.name</option>
  </select>

如果您需要将一些选项传递给 select2,或者像这样(假设您的视图模型有一个名为“options”的属性,其中包含他们文档中描述的 select2 选项):

app.html

  <require from="select2-custom-attribute"></require>

  <select select2.bind="options" value.bind="selectedState">
    <option repeat.for="state of states" model.bind="state">$state.name</option>
  </select>

这是一个工作示例:https://gist.run/?id=0137059e029fc4b3ccd367e385f47b19

很遗憾,我无法使用 jspm 正确导入 select2,即使使用列出的 shim here。如果您遇到同样的问题,您必须从上面的自定义属性代码中删除与 select2 相关的导入语句,并在您的文档中加载带有 script/link 标记的 select2 js 和 css。

【讨论】:

谢谢 Jeremy,我如何才能连接到 change 事件?我试过:&lt;select select2 value.bind="selectedState" change.delegate="chnageCallback($event)" 但我得到Maximum call stack size exceeded 错误 您无法将select2 用作导入的原因是您需要将! 放在css 导入的末尾,如下所示:import * as $ from 'jquery'; import 'select2'; import 'select2/css/select2.min.css!';【参考方案2】:

为了完成,在 Jeremy 的解决方案中触发 change 事件会导致递归循环并导致异常来修复它,我必须这样做:

attached() 
    $(this.element)
     .select2(this.value)
     .on('change', evt => 
         if (evt.originalEvent)  return; 
         this.element.dispatchEvent(new Event('change'));
     );

我可以这样做:

<require from="select2-custom-attribute"></require>

<select select2.bind="options" value.bind="selectedState" change.delegate="changeCallback($event)">
    <option repeat.for="state of states" model.bind="state">$state.name</option>
</select>

changeCallback($event) 可以是 vm 上的一个函数,例如

changeCallback(evt: Event): void 
    console.log(evt);

【讨论】:

当我动态更改 selectedState 时,视图不会更新,我会在 dispatchEvent 行之后添加它: setTimeout(() => $(this.element).change() ; , 0);

以上是关于Aurelia 试图从 Select2 加载 HTML?的主要内容,如果未能解决你的问题,请参考以下文章

toastr.js 如何在 Aurelia 和 Typescript 中工作?

Select2 从本地 json 文件加载数据

Aurelia CLI with main在main.js之前加载样式

.Net Select / Select2 淘汰 javascript - 如果初始值不在下拉列表中,则无法加载它们

使用 jQuery 从 select2 小部件中获取多个值并存储,然后重新加载它们

试图停止 Select2 多选选项删除的事件传播