- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
运行 JavaScript(在我的例子中是 jQuery)来修改 DOM 的一部分(Ember View )的正确方法是什么。
在我看来,使用 didInsertElement
不会在路由上下文更改之间运行。例如。从一个帖子到另一个帖子。
App.PageView = Ember.View.extend({
didInsertElement: function() {
console.log(this.$().find('img').length);
}
});
尝试使用 afterRender
Hook ,但结果相同。我认为这是因为 Ember 只更新 Handlebars 变量而不是 View 本身,因为它们来自同一模型。
App.PageView = Ember.View.extend({
didInsertElement: function() {
Ember.run.scheduleOnce('afterRender', this, this.afterRenderEvent);
},
afterRenderEvent: function() {
console.log(this.$().find('img').length);
}
});
我相信我可以像这样将观察者附加到 didInsertElement 上:
App.PageView = Ember.View.extend({
didInsertElement: function() {
Ember.run.scheduleOnce('afterRender', this, this.afterRenderEvent);
}.observes('controller.images'),
afterRenderEvent: function() {
if (this.$()) {
console.log(this.$().find('img').length);
}
}
});
观察者正在监听我模型上的“图像”属性,这似乎有效。这样做的方法正确吗?似乎有点过分或者我错过了什么?
例如,我的模型模板有一些需要修改的图像。
最佳答案
在这种情况下,一个可靠的方法是观察 View
中发生变化的属性,正如您所注意到的。但是,不需要触发 afterRender
,只需根据需要对 DOM 进行操作即可。
例如, http://emberjs.jsbin.com/xixit/1/edit
js
App = Ember.Application.create();
App.Router.map(function() {
// put your routes here
});
App.IndexRoute = Ember.Route.extend({
model: function() {
return ['red', 'yellow', 'blue'];
}
});
App.IndexController = Ember.Controller.extend({
images:[
"http://lorempixel.com/50/50/technics/10/",
"http://lorempixel.com/50/50/technics/12/",
"http://lorempixel.com/50/50/technics/15/",
"http://lorempixel.com/50/50/technics/17/"
],
actions:{
addImage:function(){
this.get("images").pushObject("http://lorempixel.com/50/50/technics/"+parseInt(Math.random()*10,10)+"/");
}
}
});
App.IndexView = Ember.View.extend({
showImages:false,
styleImages:function(){
/*use this, or something simple like the function runCode at the end (examples, http://jsfiddle.net/melc/sy6Ax/)*/
/*or also observe the length, if new images added*/
Ember.run.next(function(){
this.$('img').addClass("img-borders");
});
}.observes("showImages","controller.images.@each"),
actions:{
toggleImages:function(){
this.toggleProperty("showImages");
}
}
});
function runCode(selector,theMethod,timeInMillis){
if($(selector).length>0){
theMethod();
}else{
setTimeout(function(){runCode(selector,theMethod,timeInMillis);},timeInMillis);
}
}
hbs
<script type="text/x-handlebars">
<h2> Welcome to Ember.js</h2>
{{outlet}}
</script>
<script type="text/x-handlebars" data-template-name="index">
<ul>
{{#each item in model}}
<li>{{item}}</li>
{{/each}}
</ul>
<button {{action toggleImages target="view"}}>images</button>
<br/><br/>
{{#if view.showImages}}
{{#each img in images}}
<img {{bind-attr src=img}}/>
{{/each}}
<br/>
<button class="btn-add-img" {{action addImage}}> add image</button>
{{/if}}
</script>
CSS
img{
float:left;
margin-right:5px;
}
img.img-borders{
border:1px solid grey;
box-shadow: 0 0 2px 0 blue;
}
.btn-add-img{
float:left;
clear:both;
margin-top:5px;
}
关于jquery - 使用 Ember.js 正确 Hook domready,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21796741/
嘿伙计们,我使用 jquery data() 方法来存储图像的宽度。 jquery什么时候可以获取图片的宽度。 on-dom-ready 还是 on-load?是否需要加载图像来查询其宽度,或者我也可
function(){} 会先用哪个触发? A) window.addEvent('domready', function(){}); B) window.addEvent('load', funct
什么是 dojo/domReady 插件? dojo/domReady 下有哪些方法? require(["dojo/_base/fx", "dojo/fx", "dojo/on", "dojo
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: What is the difference between these jQuery ready function
我正在查看用于跟踪 domready 事件的 jQuery 源代码,有一件事我不完全理解。如果脚本是动态包含的并且是异步加载的怎么办?这样,当脚本加载时,文档可能已经加载。 jQuery 唯一检查的地
我对 mootools 有点陌生,但我知道在 jQuery 中你可以拥有多个函数(在多个文件中): $(document).ready(function() { // put all your
我最近在 jsfiddle.net 上,我将其视为一个配置选项。这让我想到它可能有助于解决我遇到的问题: 我加载了多个图像(还没有升级到单个 Sprite ),所以在它们全部下载之前我无法使用我的控件
我有一个很烦人但可能很简单的问题,我就是想不通。 在 TypeScript 文件中,我定义了以下行: import test1 = require('domReady'); 这个“domReady”模
我有一个工作的 AngularJS 应用程序,并开始使用 RequireJS 来处理模块依赖关系。遵循本指南 - http://www.startersquad.com/blog/angularjs-
在我的应用程序中,当我使用 require (来自 RequireJS)时, domReady 事件会触发实际上是加载事件的事件(当所有图像、脚本等完成加载时)。这是预期的吗? 我有一堆使用 docu
有没有一种方法可以模拟 mootools“domready”事件而不需要完整的框架? 我想要一些 javascript 来装饰我的一些文本框,以便在 onload 事件之前运行,因为我在运行之前看到未
我正在 Dojo 1.7.2 中创建一个共享栏小部件,并使用 require() 有条件地将外部社交媒体 API 作为包加载,如下所示: require({ packages:[
我一直在使用 infoWindows,但由于希望更改 infoWindow 的布局,我正在尝试切换到 infoBubble。但是,domready 事件的执行方式与 infoWindow 不同。我是一
我是 jQuery 的新手(我是从 PHP 转向 JavaScript 的)。 我将多个 jQ 函数分组在单独的文件中。我有以下问题: 是否要求每个 jQ 函数都必须在里面准备好了吗? 如果我的文件中
我需要触发一个一次性的自定义事件,其功能类似于 domready 事件,因为如果在事件发生后添加新事件,它们会立即触发。 这是针对一些在初始化某些数据和资源之前无法执行的代码,所以我想做这样的事情:
我的脚本只有在每个脚本都加载完毕并且 DOM 准备就绪后才开始工作。我想为它编写一个功能测试。 我正在使用 Linux。我使用 Lotte 编写了一个测试、CoffeeScript 和 Phantom
我有以下 HTML 结构: page-wrapper就在里面标签,所以 min-height:100%在那里工作得很好,但是page-wrapper-inner不会跨越整个高度
由于将 javascript DOM 方法放在 html 页面的底部(在 之后)比使用 jQuery 的“就绪”事件要快得多,我们不应该强制这样做: $('document').trigger('re
我正在使用 backbone.js 创建单页应用程序。我是 backbone 的新手,所以请原谅任何错误的语义。 我的问题是渲染 View 时。 最初,我的 index.html 中有一个 javas
我想在元素可用时立即与 DOM 交互。我可以使用 setInterval 来完成此操作,但它不适用于 Crossrider,因为只有在 DOM 准备好后才会加载可以与 DOM 交互的 js。有办法解决
我是一名优秀的程序员,十分优秀!