作为计算属性的 Ember 视图模板

2024-01-31

当 Ember 视图上的模板属性是计算属性时,我在更新它时遇到问题。

当视图首次加载并作为属性返回时,Ember 会正确编译模板,但当依赖项稍后更改时,模板计算属性不会更新。

这是 JSFiddle 上的示例:http://jsfiddle.net/VkJC3/ http://jsfiddle.net/VkJC3/

App=Em.Application.create();

App.MyView = Em.View.extend({
    toggle: true
    ,template: function(){
        if (this.get('toggle')) {
            return Em.Handlebars.compile('toggle is true')
        } else {
            return Em.Handlebars.compile('toggle is false')
        }
     }.property('toggle')
});

theView= App.MyView.create();
theView.append('body');

Ember.run.later(function() {
    console.log('later');
    theView.set('toggle',false);
}, 2000);
​

任何有关如何实现这一目标的其他建议都将受到赞赏。也许最好将 if 助手放入一个车把模板中。

EDIT:

这是一个更完整的示例,显示将包含上述 Ember.View 的 Ember.CollectionView:http://jsfiddle.net/VkJC3/6/ http://jsfiddle.net/VkJC3/6/

在 Ember.run.later 之后,第一项应从类型 1 更改为类型 2,并且更新计算的模板属性。

App=Em.Application.create();

App.MyView = Em.CollectionView.extend({
    content: [
        Em.Object.create({type: 1, data:"Maybe item type 1 is a link"})
        ,Em.Object.create({type: 2, data:"And item type 2 is a header"})]

    ,itemViewClass: Em.View.extend({
        template: function(){
            if (this.get('content.type')==1) {
                return Em.Handlebars.compile('<a href="#">{{view.content.data}}</a>')
            } else if (this.get('content.type')==2) {
                return Em.Handlebars.compile('<h1>{{view.content.data}}</h1>')
            }
         }.property('content.type')
    })
});


theView= App.MyView.create();
theView.append('body');

Ember.run.later(function() {
    console.log('later');
    theView.get('content')[0].set('type',2);
}, 2000);
    ​

这不是您应该设置模板的方式。该模板不应返回已编译的模板,而应充当已编译的模板。在您的代码中,您尝试将模板本身设置为计算属性,并且有条件地向其编译两个可能的模板。恕我直言,您应该编译一个模板,该模板绑定到一个计算属性,该属性根据您的切换属性评估文本,如下所示:

App = Em.Application.create();

App.MyView = Em.View.extend({
    template: Em.Handlebars.compile('toggle is {{toggleState}}'),
    toggle: true,
    toggleState: function(){
        if (this.get('toggle')) {
            return 'set to \'true\'';
        } else {
            return 'set to \'false\'';
        }
     }.property('toggle')
});

theView = App.MyView.create();
theView.append('body');

Ember.run.later(function() {
    console.log('later');
    theView.set('toggle',false);
}, 2000);

参见小提琴here http://jsfiddle.net/VkJC3/4/

这只会更改需要更改的内容,因此您不必重新编译模板。

EDIT:

我对小提琴做了一些修改(你可以看到它here http://jsfiddle.net/VkJC3/23/).

我正在做什么,而不是分配template直接属性,我将模板编译为Ember.TEMPLATES在创建应用程序之前收集(我假设您无论如何都会在产品中执行类似的操作),并且我正在更改您的计算属性以根据条件返回要使用的模板的名称(在您的情况下)content.type),并且我正在绑定templateName计算属性的属性。模板更改后,您have to rerender你的观点。代码可以改进,但我将其粘贴到此处来演示解决方案:

(function() {

    Em.TEMPLATES["one"] = Em.Handlebars.compile('<a href="#">{{view.content.data}}</a>');
    Em.TEMPLATES["two"] = Em.Handlebars.compile('<h1>{{view.content.data}}</h1>');

})();

App = Em.Application.create();

App.MyView = Em.CollectionView.extend({
    content: [
        Em.Object.create({type: 1, data:"Item type 1 is a link"}),
        Em.Object.create({type: 2, data:"Item type 2 is a header"})
    ],
    itemViewClass: Em.View.extend({
        templateNameBinding: 'currentTypeName',
        currentTypeName: function() {
            if (this.get('content.type') == 1) {
                return "one";
            } else if (this.get('content.type') == 2) {
                return "two";
            }
        }.property('content.type'),
        templateNameObserver: function() {
            this.rerender();
        }.observes('templateName')
    })
});
// ... rest of the code... 

就像我说的,这段代码可以改进......希望这有帮助

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

作为计算属性的 Ember 视图模板 的相关文章

  • Ember.js REST Ajax 成功和错误

    我想知道是什么success and error在 Ember js RESTAdapter 中做ajax函数 https github com emberjs data blob 761412849a56ad086c44659faafa5
  • 如何让 jQuery Mobile 停止破坏 Ember.js 网站?

    我有一个用 Ember js 编写的网站 导航基于带有 符号的 url 我已经包含了 jQuery Mobile 我也有 jQuery 标准 jQuery 还可以 但是当我包含 jQuery Mobile 时 奇怪的事情发生了 符号从 UR
  • ember 数据验证的标准模式是什么? (无效状态,变成无效……)

    我已经为此苦苦挣扎了一段时间 让我们看看是否有人可以帮助我 尽管自述文件中没有明确说明 但 ember data 提供了一定程度的验证支持 您可以在代码和文档的某些部分看到 https github com emberjs data blo
  • Ember:在 Mixin 中以编程方式设置 queryParams

    我正在尝试以编程方式在 Ember Mixin 中定义 queryParams mixin 有一个方法 当持有 mixin 的控制器初始化时会调用该方法 setupQueryParams params gt params forEach p
  • 标签中的 Ember 车把模板

    ember 特别是应用程序模板 是否可以在 head 标签内进行操作 以便动态更改标题标签 元标签 外部 css 样式表和 favicon 等内容 如果是这样 那么一种干净的方法是什么 为了完成这项工作 我所做的是创建车把助手 例如 如果您
  • 如何更改 Ember 中的查询参数?

    我正在编写一个动作处理程序route application actions changeFoo foo I want to change the fooId queryParam to foo get id 问题是我能找到的唯一记录的更改
  • Ember.js 在特定页面上包含外部脚本

    我试图弄清楚如何包含外部 javascript 源 图表 但仅限于网站上的单个页面 可以在视图或模板中完成吗 我发现只需添加页面模板不起作用 如果我将它添加到整个网站的模板中 它加载得很好 但是它会加载到每个页面上 我的问题的另一面可能更具
  • Ember Data:重写 Save 方法

    您好 Ember 数据世界 我一直在研究自定义适配器 试图找出如何覆盖保存方法 根据我的理解 你似乎需要做这样的事情 DS RESTAdapter extend save function return this super 但是 当我尝试
  • 如何获取 ember 应用程序控制器中模板复选框的值

    我正在尝试查找控制器中是否选中了该复选框 这是我的模板 这是我的控制器 App Ember Application create App ApplicationController Ember Controller extend
  • 使用 Ember.js 为每个模型添加额外的 url 参数

    我有两个模型 App Providers DS Model extend name DS attr string description DS attr string logo DS attr string products DS hasM
  • Ember 数据保存关系

    我很难在 ember 数据中保存一对多关系 我有这样的关系 App ParameterSet DS Model name DS attr string regions DS hasMany App Region App Region DS
  • 我的 Rails 路由应该是什么样子才能与 pushState Ember.js 路由一起使用?

    简而言之 当构建 Ember js 应用程序以持久保存到 Rails 应用程序时 我应该如何处理 Rails 路由 视图 我想我只需要 Rails 来渲染 application html erb 布局 以便 Ember js 应用程序初始
  • 在车把模板中显示 hasMany ember 关系中的第一项

    我需要显示 hasMany 关系中的第一项 基本上一个线程可以有多个作者 但我只需要在特定模板中显示第一个作者 我有以下 json threads id 1 authors 2 3 authors id 2 fullname foo id
  • Ember.js + Mirage:在集成测试中拉取模拟关系

    我有一个使用的组件this get model property 并且它按预期工作 对于我的集成测试 我使用 Mirage 它适用于我的所有其他测试 包括集成测试 但是当我测试这个特定组件时 我得到 TypeError Cannot rea
  • Ember 不更新模型更改的视图

    该小提琴重新创建了入门套件 并带有可更改模型的额外按钮 http jsfiddle net UjacC 1 http jsfiddle net UjacC 1 但是 当单击 更改 时 数组会更改 但视图不会更新 为什么
  • 在 Ember 中将模型属性插入 Img 元素 URL

    我有一个模型image id财产 我有一个包含图像元素的模型视图 我需要将 id 插入图像元素的src属性来完成图像的 URL 以便我有效地执行此操作 img src 我的第一次尝试使用了 Handlebars 助手 img src 但这也
  • 使用 store.findQuery 时捕获 404 错误

    我正在使用余烬findQuery方法并想知道如何在没有结果时捕获 404 错误 this store findQuery customer hasProjects true getArchivedProjects archived then
  • 2015 年重新审视 Ember Handling 401

    我可以在 Ember Ember Data 中找到大量询问 回答如何从 Rails 后端处理 401 的老问题 许多 如果不是全部的话 在这一点上似乎已经过时了 我已经尝试了我能找到的一切 Ember 数据处理 401 https stac
  • 如何将 hashbang url 更改为历史 API

    我正在使用 ember1 0 rc3 我想将 hashbang url 更改为正常的 url 格式 即 www site com admin page1 到 www site com admin page1 更改 我在应用程序路由器中使用位
  • Ember:命名出口错误

    我不知道为什么我的模板没有在指定的插座中呈现 这是我第一次尝试学习 ember 我被困在指定的渠道上 我想渲染侧边栏模板 in the outlet sidebar 和内容模板 in the outlet content 但我不断在控制台中

随机推荐