2

我发现了很多关于如何使用动态数据等初始化 jQuery 插件的问题,通常答案是你应该使用didInsertElement钩子。我的问题是,当使用 ember-data 时,最初视图插入为空,然后通过绑定填充模板变量。因此,didInsertElement我需要的元素不存在。

我找到了适合我的解决方案,但我认为必须有更好的解决方案。

除了didInsertElement方法之外,我还观察了控制器中的属性,并从那里调用我的代码,包裹在 a 中,Ember.run.next这样子视图就会在之前呈现。

是否有更好的解决方案来响应更新的子视图?

4

2 回答 2

1

我遇到了这个问题并想出了一个解决方案:制作一个车把助手,告诉你子部分何时呈现。希望对其他人有所帮助!

于 2012-12-13T10:38:42.253 回答
1

这在一定程度上取决于您的应用程序的大小,以及您的视图正在呈现的元素数量。

编辑:您可能会成功观察 RecordArray 的 isLoaded 属性。这里的一些细节:https ://github.com/emberjs/data/blob/master/packages/ember-data/lib/system/record_arrays/adapter_populated_record_array.js#L21

我用于将单个对象作为其内容的视图的一个选项是:

MyApp.CustomView = Ember.View.extend({
    content: null,

    contentObserver: function() {
        this.rerender();
    }.observes('content')
}

但是,如果您的视图内容是一个列表,那么为列表中的每个项目重新呈现视图几乎没有意义。

但是,我认为这种方法与您已经在做的非常相似。

另一种方法是使用 Ember Data 实现您自己的适配器。这样,您可以告诉应用程序的其余部分它已完成数据加载。就像是:

MyApp.Adapter = DS.Adapter.create({
    //Finding all object of a certain type. Fetching from the server
    findAll: function(store, type, ids) {
        var url = type.url;
        jQuery.getJSON(url, function(data) {
            store.loadMany(type, data);
        });

        //Perform some custom logic here... 
    }
}

这应该可行,但它不像它应该/可能的那样通用。

此外,您可能想查看此提交,它允许注册一次性事件。

https://github.com/emberjs/ember.js/commit/1809e65012b93c0a530bfcb95eec22d972069745#L0R19

于 2012-06-28T11:06:47.327 回答