Javascript Ember.js-在所有转换上运行与视图相关的js,而不仅仅是在模型更改时

Javascript Ember.js-在所有转换上运行与视图相关的js,而不仅仅是在模型更改时,javascript,jquery,html,ajax,ember.js,Javascript,Jquery,Html,Ajax,Ember.js,我有一个带有copy属性的“退伍军人”模型,这是一个文件名,表示通过AJAX在配置文件页面上加载的HTML页面。HTML文件包含一些硬编码的余烬链接,例如。大多数链接在转换到其他模型时都可以工作,但是当模型相同时,不会调用下面的ajax函数,也不会将HTML文件加载到DOM中 如何确保在每次转换时都运行此代码,而不是仅在模型更改时运行 App.VeteranView = Ember.View.extend({ didInsertElement: function(){

我有一个带有copy属性的
“退伍军人”
模型,这是一个文件名,表示通过AJAX在配置文件页面上加载的HTML页面。HTML文件包含一些硬编码的余烬链接,例如
。大多数链接在转换到其他模型时都可以工作,但是当模型相同时,不会调用下面的ajax函数,也不会将HTML文件加载到DOM中

如何确保在每次转换时都运行此代码,而不是仅在模型更改时运行

 App.VeteranView = Ember.View.extend({
    didInsertElement: function(){
        // Here we fetch the URL provided in the veteran model and load this data, which represents the main copy
        // of the particular vet into the attr div
        Ember.run.schedule('afterRender', this, function(){
            var ember = this.$().attr('id');
            $(document).ready(function() {
                var div = $('#' + ember).find(".attr");
                var url = div.data("id");
                $.get(url, function(data) {
                    div.html(data);
                    if ($(window).width() >= 767) {
                        $('.profile-info .columnizer').columnize({ columns: 2 });
                    }
                });
            });
        });
    }
});
多亏了kingpin,我成功地调整了他的代码,这样我就可以在每次转换后访问动态DOM元素,即使模板保持不变。将Ember run循环设置为“later”意味着有500毫秒的延迟,这似乎足够让所有东西完成加载和转换

App.VeteranView = Ember.View.extend({
watch: function(){
    Ember.run.later(this, this.ajaxLoad);
}.observes("controller"),

ajaxLoad: function(){
    // Here we fetch the URL provided in the veteran model
    // load this data, which represents the main copy
    // of the particular vet into the attr div
    var profileDiv = $(".profile-info");
    var url = profileDiv.find(".copy-url").text();
    if (url) {
        console.log("Rendering: " + url);
        $.get(url, function(data) {
            // First we'll load the data into the DOM
            profileDiv.find(".attr").html(data);

            // Now check if IE and browser width
            var ua = window.navigator.userAgent;
            var msie = ua.indexOf("MSIE ");

            if ($(window).width() >= 767 && msie > 0) {
                profileDiv.find('.columnizer').columnize({ columns: 2 });
            }
        });
    }   
}

}))

您有两个选择

1.在
setupController
中执行此操作,每次模型更改时都会执行此操作。通常情况下,不建议对view magic使用此选项,因此请跳过此选项。 设置控制器 2.在模型引用上添加一个观察者,当它发生更改时,它将变为野生状态 视图观察模型
示例(查看颜色视图):

两个注释:
$(文档)。可能只有在页面加载时才会触发ready
。我错了吗?此外,您还可以从元素(
var ember=this.$().attr('id');
)中获取id,然后使用该id获取相同的元素(
$('#'+ember)
)。另一件事是,
didInsertElement
在其插入时只应在视图上触发一次。也许可以将AJAX放在另一个手动调用的方法中。最后,您提到有一个
老手
模型。如果您使用的是余烬数据,那么可以使用
store.find('ventive')
语法发出请求。这有什么帮助吗?如果页面已经准备好,文档准备就绪会立即触发,因此不会有任何伤害,在这种情况下,这是毫无意义的,因为在文档准备好之前,ember应用程序不会启动,但无害。嗨,Jim,欢迎所有的指针,谢谢,我只是认为视图对象中的didInsertElement是一种错误的连接到每个转换的方法。你的意思是,如果你在路径“a”上,并单击路径“a”的链接,则不会调用Ajax吗?嗨,Charlie,不完全是这样。当您访问共享相同底层模型的页面时,例如,假设我在“index#/veterans/1”上,我转到“index#veterans/2”,则不会调用didInsertElement,也不会执行AJAX。它只在模型发生变化时才被调用,而且效果很好。我只是想挂接到每个转换中,但是当加载DOM时。您好,Kingpin2k,这看起来非常接近。谢谢您,尽管我在尝试访问DOM元素时遇到了未定义的错误,例如:$()。我更新了原始问题代码。
App.FooRoute = Em.Route.extend({
  setupController: function(controller, model){
    this._super(controller, model);
    Em.run.scheduleOnce('afterRender', function(){
      alert('do it here');
    });
  }
});
App.VeteranView = Ember.View.extend({
    watchStuff: function(){
        Ember.run.scheduleOnce('afterRender', this, this.doStuff);
    }.observes('controller.model').on('didInsertElement'),

    doStuff: function(){
      var el = this.$();
      if(el){
        el.hide(); // hahaha, get that user good
      }
    }
});