【问题标题】:Emberjs get one value from a collection of arrayEmberjs 从数组集合中获取一个值
【发布时间】:2014-03-12 15:30:24
【问题描述】:

我最近使用 bootstrap 实现了一个小型缩略图库,我想使用模态来在更大尺寸的弹出窗口中打开图像。

到目前为止,我已经触发了模式,但我不知道如何为点击的一张图片显示该特定值。

这是我的缩略图生成:

<div class="row">
    {{#each value in images}}
        <div class="col-md-4">
            <a class="thumbnail" data-toggle="modal" data-target="#myModal">
                <img src="data:{{unbound value.mimeType}};base64,{{unbound value.image}}">
            </a>
        </div>
    {{/each}}
</div>

这是我的模态(非常基本的):

<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
    <div class="modal-dialog">
        <div class="modal-content">
            <div class="modal-header">
                <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
                <h4 class="modal-title" id="myModalLabel">title of my image</h4>
            </div>
            <div class="modal-body">
                Images here
            </div>
        </div>
    </div>
</div>

是否可以使用车把检索一个特定值以显示在我的模态中?

我会知道如何在 js 中做到这一点,但是使用 ember 和车把有点难。

[edit] 我的页面查询的控制器:

App.EnquiryController = Ember.ObjectController.extend({
    isUpdating: false,

    actions: {
        showUpdateForm: function() {
            this.setProperties({ isUpdating: true });
        },
        customerUpdate: function() {
            this.setProperties({ isUpdating: false});
            var data = this.get('model');
            var obj = {
                customerName: data.enquiry.customerName,
                customerEmail: data.enquiry.customerEmail,
                customerPhone: data.enquiry.customerPhone
            };
            console.log(obj);
            Ember.$
            .post(host + '/enquiry/' + data.enquiry.id, obj, function(data) {
                console.log('DEBUG: Updating customer data OK');
            });
        },
        cancelCustomerUpdate: function() {
            this.setProperties({isUpdating: false});
        },
        tradeInUpdate: function() {
            var data = this.get('model');
            var obj = {
                mileage: data.tradeIn.mileage,
                valuationPrice: data.tradeIn.valuationPrice
            };
            console.log(data);
            Ember.$
            .post(host + '/enquiry/' + data.enquiry.id + '/tradeIn', obj, function(data) {
            console.log('DEBUG: Update TradeIn OK')
            })
        },
        summaryUpdate: function() {
            var data = this.get('model');
            var obj = {
                deposit: data.totals.deposit,
                discount: data.totals.discount
            };
            Ember.$
            .post(host + '/enquiry/' + data.enquiry.id, obj, function(data) {
                console.log('DEBUG: Update Summary OK');
            });
            console.log(obj);
        }
    }
});

我有很多数据显示在那里,使用选项卡引导程序隐藏和显示它。

[edit2] 错误:

Uncaught TypeError: Object function () {
if (!wasApplied) {
  Class.proto(); // prepare prototype...
}
o_defineProperty(this, GUID_KEY, undefinedDescriptor);
o_defineProperty(this, '_super', undefinedDescriptor);
var m = met...<omitted>...t' 

[edit3] 我得到了很好的图片链接,但我无法从视图中设置控制器变量..

var ClientView = Em.View.extend({
    actions: {
        selectItem : function(item) {
            console.log(item.uri);
            App.EnquiryController.set("imageSrc", item.uri);
        }
    }
});

{{#view ClientView}}
    <div class="row">
        {{#each value in images}}
        <div class="col-md-4">
            <a class="thumbnail" data-toggle="modal" data-target="#myModal" {{action "selectItem" this.value target="view"}}>
                <img src="data:{{unbound value.mimeType}};base64,{{unbound value.image}}">
            </a>
        </div>
        {{/each}}
    </div>
{{/view}}

在我的控制器中:

App.EnquiryController = Ember.ObjectController.extend({
    imageSrc: null
});

【问题讨论】:

  • 如果您发布您的控制器,我可以向您展示一种解决方案。我通常使用一个动作来打开模态,然后将模型绑定到一个控制器属性,如“selectedItem”,然后在模态车把模板中使用它。我也更喜欢在迭代集合时设置一个项目控制器,以避免在操作方法中传递模型......
  • 我已经用我的控制器为你编辑了帖子。

标签: twitter-bootstrap ember.js handlebars.js


【解决方案1】:

我在其他情况下遇到过这个问题。所以我做的是

{{#view ClientView}}
<div class="row">
    {{#each value in images}}
        <div class="col-md-4">
            <a class="thumbnail" data-toggle="modal" data-target="#myModal" {{#action selectItem this target="view">
                <img src="data:{{unbound value.mimeType}};base64,{{unbound value.image}}">
            </a>
        </div>
    {{/each}}
</div>
{{/view}}

然后在视图中举例:

var ClientView = Em.View.extend({
   actions: {
     selectItem : function(item){
       ClientController.set("imageSrc", item.src);
     }
  }
})

在模态中我放了这个:

<img {{bindAttr src="ClientController.imageSrc"}}>

希望对你有帮助

【讨论】:

  • 我不确定是否理解您的所有想法,但是在我将其实施到我的代码中后,我遇到了这个错误:Uncaught ReferenceError: ClientController is not defined 我该怎么办?创建一个控制器?但是在里面做什么呢?
  • 跟随你的控制器,而不是“ClientController”,你应该使用你的“App.EnquiryController”并添加一个变量“imageSrc”来存储你想要的值。
  • 但是我在项目中有我的整个模型,我不知道用户最后点击了哪个图像?我试图放置一个特定的图像(在 base64 中)我有一个错误(我已编辑有错误的主要帖子)。
  • 好的,我知道我需要从动作助手传递 this.value 而不是这个。但是,看起来我无法从我的视图中在我的控制器中设置我的变量。我已经修改了我的帖子。
  • 很抱歉,我看不到您的修改。您是否查看了您不想在操作中调用的函数是否有参数?我建议在代码中放置一个断点(使用谷歌浏览器拥有的工具),然后查看是否调用了它的函数以及传递的参数的值是什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-05
  • 1970-01-01
  • 1970-01-01
  • 2021-01-16
  • 2018-07-13
  • 1970-01-01
  • 2018-09-11
相关资源
最近更新 更多