将 Ember 组件附加到不受 Ember 管理的 DOM 元素

2024-05-08

我想附加一个 Ember 组件ComponentB到由某些非 Ember UI 库生成的 DOM 元素didInsertElement of ComponentA,导致类似的结果

<div class='ember-view component-a'>
   <div class='i-know-nothing-of-ember'>
      <div class='ember-view component-b'></div>
   </div>
</div>

我知道appendTo(element)方法,但是断言失败

您无法追加到现有的 Ember.View。考虑使用 Ember.ContainerView 代替。

我也尝试过打电话createElement在组件 B 上,然后通过 jQuery 将其附加到 DOM - 这种方法可行,但最终失败并出现错误

无法将属性“_elementInserted”设置为 null

See http://emberjs.jsbin.com/cofebo/2/ http://emberjs.jsbin.com/cofebo/2/

是什么proper实现上述目标的方法;如果可能的话,行动和其他行为应该像i-know-nothing-of-ember将由组件 A 模板生成。


我建议使用容器来查找组件并在需要时将其附加到任何地方。

方法 1 - 检索路线内的容器

http://emberjs.jsbin.com/libipazavu/1/edit?html,js,输出 http://emberjs.jsbin.com/libipazavu/1/edit?html,js,output

js

App = Ember.Application.create();

App.IndexRoute = Em.Route.extend({
  setupController:function(controller,model){
    controller.set("container",this.container);
  }
});

App.IndexView = Em.View.extend({

  appendNonEmberUILibrary:function(){
    callNonEmberUILibrary();
    var componentB = this.get("controller.container").lookup("component:component-b");
    componentB.appendTo(".non-ember-ui");
  }.on("didInsertElement")
});

App.ComponentBComponent = Em.Component.extend({
  layoutName:"components/component-b",
  prop1:"test-option-1"
});


function callNonEmberUILibrary(){
  $("body").append("<div class='non-ember-ui' style='border:1px solid;'>element from non-ember ui lib</div>");
}

hbs

<script type="text/x-handlebars">
    <h2>Welcome to Ember.js</h2>
    <h3>Adding Ember Component to non-Ember DOM Element using <u><i>container</i></u></h3>

    {{outlet}}
  </script>

  <script type="text/x-handlebars" data-template-name="components/component-b">
  <br/>
  <div style="border:1px dashed #F5664D">
  This is componentB ->  {{prop1}}
  </div>
  <br/>
  </script>

方法 2 - 在初始化程序中检索容器

http://emberjs.jsbin.com/hijedowacu/1/edit?html,js,输出 http://emberjs.jsbin.com/hijedowacu/1/edit?html,js,output

js

App = Ember.Application.create();

App.initializer({
  name:"main",
  initialize:function(container,application){
     application.register('main:compB', container.lookup("component:component-b"), { instantiate: false });
     application.inject("controller:index","theComponentB","main:compB");
  }
});

App.IndexView = Em.View.extend({

  appendNonEmberUILibrary:function(){
    callNonEmberUILibrary();
    var componentB = this.get("controller.theComponentB");
    componentB.appendTo(".non-ember-ui");
  }.on("didInsertElement")
});

App.ComponentBComponent = Em.Component.extend({
  layoutName:"components/component-b",
  prop1:"test-option-1"
});


function callNonEmberUILibrary(){
  $("body").append("<div class='non-ember-ui' style='border:1px solid;'>element from non-ember ui lib</div>");
}

hbs

<script type="text/x-handlebars">
    <h2>Welcome to Ember.js</h2>
    <h3>Adding Ember Component to non-Ember DOM Element using <u><i>container</i></u></h3>

    {{outlet}}
  </script>

  <script type="text/x-handlebars" data-template-name="components/component-b">
  <br/>
  <div style="border:1px dashed #F5664D">
  This is componentB ->  {{prop1}}
  </div>
  <br/>
  </script>

方法3 - 使用 jquery 重新分配添加的组件(从评论中更新)

或者你可以只添加component-b在模板中作为不可见且在didInsertElement您可以使用 jquery 重新分配并在需要的地方显示它。

example http://jsbin.com/maginovexa/1/edit?html,js,输出 http://jsbin.com/maginovexa/1/edit?html,js,output

js

App.IndexView = Em.View.extend({
  prop2:"prop-from-index-view",
  appendNonEmberUILibrary:function(){
    callNonEmberUILibrary();
    //var componentB = this.get("controller.container").lookup("component:component-b");
    //componentB.appendTo(".non-ember-ui");
    var componentBDOM = this.get("componentB").$().detach();
    $(".non-ember-ui").append(componentBDOM);
  }.on("didInsertElement"),
  click:function(){this.set("prop2",Date.now());}
});

App.ComponentBComponent = Em.Component.extend({
  layoutName:"components/component-b",
  prop1:"test-option-1"
});


function callNonEmberUILibrary(){
  $(".inner").append("<div class='non-ember-ui' style='border:1px solid;'>element from non-ember ui lib</div>");
}

hbs

<script type="text/x-handlebars">
    <h2>Welcome to Ember.js</h2>
    <h3>Adding Ember Component to non-Ember DOM Element using <u><i>container</i></u></h3>
    <div class='inner'></div>
    {{outlet}}
  </script>

  <script type="text/x-handlebars" data-template-name="index">
  this is index (click here to change prop2 of component)
  <div style="display:none">
    {{component-b prop2=view.prop2 viewName="componentB"}}
    </div>


  </script>
....

这是一个完全有效的解决方案,用于根据 Simon Jesenko(操作者)的要求,将 ember 控制的元素重新分配到 ember 视图内的非 ember 元素。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 Ember 组件附加到不受 Ember 管理的 DOM 元素 的相关文章

  • ember 数据验证的标准模式是什么? (无效状态,变成无效……)

    我已经为此苦苦挣扎了一段时间 让我们看看是否有人可以帮助我 尽管自述文件中没有明确说明 但 ember data 提供了一定程度的验证支持 您可以在代码和文档的某些部分看到 https github com emberjs data blo
  • Ember.js - jQuery-masonry + 无限滚动

    我正在尝试在我的 ember 项目中实现无限滚动和砌体工作 砖石 砖块 是带有文字和图像的柱子 目前 我可以在页面初始加载时显示第一页并应用砌体 不过 我仍然需要执行 setTimeout 试图找出如何摆脱它 我还有基本的无限滚动代码 现在
  • 在 Ember.js 中,存储保存和存储提交之间有什么区别?

    有什么区别 this get store commit and this get store save 没有区别 save是一个别名commit与此一起介绍的PR 使 commit 成为 save 的别名 https github com
  • Ember:在 Mixin 中以编程方式设置 queryParams

    我正在尝试以编程方式在 Ember Mixin 中定义 queryParams mixin 有一个方法 当持有 mixin 的控制器初始化时会调用该方法 setupQueryParams params gt params forEach p
  • 根据grunt任务设置Env变量

    我有一个 web 应用程序 emberjs 我需要根据 grunt 任务设置环境变量 所以当我跑步时grunt server它会选择development 并且 url 将被设置为localhost 5000 但当我这样做时grunt bu
  • 如何更改 Ember 中的查询参数?

    我正在编写一个动作处理程序route application actions changeFoo foo I want to change the fooId queryParam to foo get id 问题是我能找到的唯一记录的更改
  • 从模板访问模型

    在玩 ember 时 我发现有时模型存储在控制器的content属性 有时模型也可以直接在控制器上使用 然而 当这种情况发生时 我不明白 让我用一个我在组装 ember MVC 时发现的例子来解释一下 设置 A 开始 我定义了一个自定义Me
  • 如何获取 ember 应用程序控制器中模板复选框的值

    我正在尝试查找控制器中是否选中了该复选框 这是我的模板 这是我的控制器 App Ember Application create App ApplicationController Ember Controller extend
  • 未捕获的类型错误:运行 QUnit 测试时无法调用未定义 Ember 数据的方法“extractId”

    我越来越 Uncaught TypeError Cannot call method extractId of undefined 使用 QUnit 运行集成测试时 失败的测试 module Points setup gt App rese
  • Ember 数据保存关系

    我很难在 ember 数据中保存一对多关系 我有这样的关系 App ParameterSet DS Model name DS attr string regions DS hasMany App Region App Region DS
  • 观察嵌套对象的属性

    小提琴示例 http emberjs jsbin com aviyUnA 9 edit html js 输出 http emberjs jsbin com aviyUnA 9 edit html js output 这是我的模型 name
  • 恢复对 ember 数据模型的更改

    有没有办法轻松恢复对 Ember 数据模型的更改 我有一个绑定到编辑视图的模型 此视图使用户能够取消编辑 此时我想恢复对模型的更改 有没有一种简单的方法可以做到这一点 而无需克隆所有值 从 Ember Data 版本 2 开始 不再有交易
  • Ember:如何使用 i18n lib 翻译占位符?

    See http jsfiddle net cyclomarc 36VS3 1 http jsfiddle net cyclomarc 36VS3 1 我正在使用 Ember i18n lib 进行翻译 如何在 Ember TextFiel
  • 在 Ember 中将模型属性插入 Img 元素 URL

    我有一个模型image id财产 我有一个包含图像元素的模型视图 我需要将 id 插入图像元素的src属性来完成图像的 URL 以便我有效地执行此操作 img src 我的第一次尝试使用了 Handlebars 助手 img src 但这也
  • 对 EmberJS 对象的反思?如何在事先不知道密钥的情况下查找属性密钥列表

    如果您事先不知道所有密钥 是否有办法检索 EmberJS 对象的 set at creations 属性 通过检查器 我看到所有似乎存储在元对象中的对象属性values哈希 但我似乎找不到任何方法来恢复它 例如object getPrope
  • 在 EmberJS 中获取父路由

    我正在制作一个可重用 有点多态 的评论小部件 我想要一个按钮 使我能够返回到父路由 例如 如果我位于 blog posts 1 comments 我希望该按钮将我带回 blog posts 1 我目前正在使用transitionToRout
  • 2015 年重新审视 Ember Handling 401

    我可以在 Ember Ember Data 中找到大量询问 回答如何从 Rails 后端处理 401 的老问题 许多 如果不是全部的话 在这一点上似乎已经过时了 我已经尝试了我能找到的一切 Ember 数据处理 401 https stac
  • 与查询参数一起使用时,Ember .observe() 返回两次回调

    http jsbin com vowup 2 http jsbin com vowup 2 如果我单击更改为随机 程序将登录控制台两次 由于某些奇怪的原因 将修订变量设置为字符串时它可以正常工作 但对于数字或任何其他类型的变量会记录两次 将
  • 如何在 Ember 中捕获数组是否插入到车把中?

    我希望这不是重复的问题 但我无法找到解决方案 我有工作和用户 一个用户有很多工作 JP User DS Model extend firstName DS attr string lastName DS attr string email
  • 在哪里放置固定装置?

    我应该在使用 ember cli 生成的 Ember JS 应用程序中的哪里定义固定装置 我尝试过很多地方 例如app js并在一个名为 fixtures 的文件夹中 经过一番挖掘后我发现改变Ember MODEL FACTORY INJE

随机推荐

  • Android 中未找到 PhoneGap 类错误

    我的 PhoneGap Android 应用程序遇到一些问题 到目前为止我明白了 我已经把一切都做好了 这是我所做的 在 Eclipse 中创建项目后 我在 libs 文件夹中添加了 cordova 2 2 0 jar 然后我编辑了Andr
  • bitbucket、“hg 推送”和“hg 更新”

    如果我从本地 Mercurial 存储库开始 我认为它是 主要 存储库 请原谅我的 dvcs 领主 并打算使用 bitbucket 作为备份和问题跟踪工具 我可以在本地进行所有更改repo 并执行 hg Push 将更改发送回 bitbuc
  • 循环放入和取出剪贴板,无延迟

    我正在使用以下代码将文本复制到剪贴板 System Windows Forms SendKeys SendWait c 然后我用 Clipboard GetText 从剪贴板获取文本 它工作正常 但当我循环使用剪贴板并且我得到的内容应该被下
  • 持续集成的投资回报率是多少?

    目前 我们的组织没有实行持续集成 为了让我们启动并运行 CI 服务器 我需要生成一份文档来证明投资回报 除了通过尽早发现和修复错误来节省成本之外 我很好奇我可以将其写入本文档的其他好处 节省 我喜欢 CI 的第一个原因是它有助于防止开发人员
  • 使用 Morphia 配置 Spring Boot?

    我不想利用 Spring DATA MongoDB 支持 我想利用名为 Morphia 的 MongoDB ORM https github com mongodb morphia https github com mongodb morp
  • 如何在 Angular JS 中显示以字节数组形式接收的图像

    我有一个将返回图像的服务器端应用程序 这些是响应标头 Content Disposition attachment filename 8822a009 944e 43f4 999b d297198d302a 1 0 low res Cont
  • SqlCommand返回值参数

    也许查看此代码的其他人能够告诉我为什么 returnID 始终为 0 我正在尝试从插入的记录中检索新的 ID public int AddToInventory int PartID int QtyOnHand int SpokenFor
  • 使用新数据输入自动更新图表

    我的图表从 DataGridView 加载数据 如果将新值插入到 DataGridView 中 我希望自动使用新数据更新图表 我的图表必然是table1 and table2在我的 DataGridView 中 它从 DataTable 获
  • 从 Harp.js 中的 EJS 模板调用另一个文件上的 javascript 函数

    尝试使用 Harp js 制作一个网站 我使用 ejs 模板 并希望将一些有用的 javascript 函数存储在中央文件中 我怎么做 我尝试使用 但它不起作用 似乎js文件没有被解析 有任何想法吗 谢谢 尽管有多种方法 有时 可以实现这一
  • 如何使用 javascript 选择页面上的任意文本?

    假设我有一个 contentEditablediv 用户可以编辑和更改其中的文本和元素 我如何任意更改此选择div用JavaScript 我所说的 更改 并不是指 更改用户选择的内容 我的意思是实际上更改what被选中 然后 用户应该能够在
  • 如何用C语言测量时间?

    我想知道某个代码块执行了多长时间 大约 像这样的事情 startStopwatch do some calculations stopStopwatch printf lf timeMesuredInSeconds How 您可以使用clo
  • Android 中的 ImageView 拖动限制

    我在布局中有一个 ImageView 并在 ImageView 上设置 OnTouchListener 来拖动 ImageView 它工作得很好 我的问题是如何防止将 ImageView 移动到布局范围之外 这是我的代码 活动类别 publ
  • 如何远程调试长时间运行的 python 脚本或服务?

    正如标题所说 我希望能够连接到在 Paster 或 uwsgi 下运行的 python 进程并利用 pdb 功能 Using winpdb http winpdb org 您可以像这样附加到正在运行的进程 插入 import rpdb2 r
  • 如果我将一个大函数声明为内联函数怎么办?

    我搜索了一些相关问题 例如C 中内联函数的好处 https stackoverflow com questions 145838 benefits of inline functions in c 但我还有疑问 如果内联函数只是为了 为编译
  • 通过 Selenium 捕获 JSON 响应

    我正在使用 Selenium IDE 或 webdriver 测试网页 该网页有一个 搜索 功能 基本上只是一个带参数的 GET 调用 javascript 还输出以控制台从搜索调用返回的 JSON 即类似console log data
  • CSS 3假3D立方体在2个盒子之间旋转

    我使用 css 实现了翻转旋转 flip card position relative z index 1 webkit perspective 1000px moz perspective 1000px o perspective 100
  • 如何在反应导航中将道具传递给“屏幕”/组件

    我对一般编程相当陌生 甚至对 JS 和 React Native 还比较陌生 但我已经为此工作了一整天 但我仍然没有弄清楚 所以我求助于 Stack Overflow 希望有人能帮助我可以帮我 基本上我想要完成的是设置其他Component
  • PHP ajax使用新数组上传多个文件

    它是我的上传 html 代码 div class col xs 12 div
  • Nodemon - 使用配置文件指定扩展监视列表

    有没有办法使用配置文件而不是命令行来指定监视列表 Nodemon 文档中的命令行方法 我尝试使用nodemon json配置文件包含以下内容 ext js json hbs html 返回 扩展名匹配 错误 然后我尝试将配置添加到packa
  • 将 Ember 组件附加到不受 Ember 管理的 DOM 元素

    我想附加一个 Ember 组件ComponentB到由某些非 Ember UI 库生成的 DOM 元素didInsertElement of ComponentA 导致类似的结果 div class ember view component