Ember.js EmberJS:如何动态地重新加载模型和模板(在一个操作之后,按下ex';按钮';)

Ember.js EmberJS:如何动态地重新加载模型和模板(在一个操作之后,按下ex';按钮';),ember.js,Ember.js,EmberJS版本1.11.3 我有一个按钮,当按下时,它会向我的服务器发送一个Ajax查询并返回一些数据。我希望每次都用新数据刷新此按钮下的视图 以下是简化的把手模板: <script type="text/x-handlebars" data-template-name='query'> <form class="form-vertical" {{action "sendQuery" model}}> <div class="contro

EmberJS版本1.11.3

我有一个按钮,当按下时,它会向我的服务器发送一个Ajax查询并返回一些数据。我希望每次都用新数据刷新此按钮下的视图

以下是简化的把手模板:

<script type="text/x-handlebars" data-template-name='query'>
    <form class="form-vertical" {{action "sendQuery" model}}>
        <div class="control-group">
            {{input value=this.totoQuery type="text" placeholder="Enter an SQL query...."}}
        </div>
        <button type="submit" class="btn">Send ! </button>
    </form>
</script>
Ajax调用工作正常,路由中也定义了模型(我使用虚拟模型进行了测试)。但是,当我尝试使用以下内容更新模型时:

model=data.entries; //The template does not update with it!!! The template still displays the data from the dummy model.
我不能用这个.set('model',data)修改它,因为“未定义的函数!!这个.set”。。 我的虚拟模型:

App.QueryRoute = Ember.Route.extend({
    model: function() {
        return [{
            'title': 'A book title like Harry Potter of Fifty Sha... nvm.. '
        }];
    }
});
非常感谢您的任何建议


PS:我在这方面花了太多时间:(

您可以通过以下方式获得控制器内部的模型操作:

 sendQuery: function() {
        var self = this,
            totoQuery = this.get('totoQuery');
        var promise = asyncAjax(queryservice + '?query=' + totoQuery);
        promise.done(function(data) {
            $.each(data.entries, function (index, entry){
              self.get('model').pushObject(entry);
            });
        })
    }
您不需要将模型作为参数传递到操作中。您可以执行以下操作:

  <form class="form-vertical" {{action "sendQuery"}}>


控制器自动继承模型属性。一件事是,使用
this获取模型属性。在Ember中,totoQuery
将被弃用。相反,使用
模型。ToToToQuery
如果您太费劲了,您也可以从控制器而不是从路线直接从模型渲染某些内容,这样做您可以从控制器中更新变量,并且很容易更改

App.QueryController = Ember.Controller.extend({
    queryResponse: [],
    totoQuery: '',
    actions: {
        sendQuery: function(model, route) {
            var self = this;
            var promise = asyncAjax(queryservice + '?query=' + this.totoQuery);
            promise.success(function(data) {
            //model=data.entries;
            self.set('queryResponse', data.entries);
        })
    }
})
在模板中,您可以直接渲染它

<ul>
{{#each item in controller.queryResponse}}
    <li>item.name</li>
{{/each}}
</ul>
    {{{#controller.queryResponse}中的每个项
  • item.name
  • {{/每个}}

2件事我从你的回复中意识到:1.似乎
this.get('model')
在Ajax承诺的“success”函数中不起作用。我只能推测这是因为该函数在控制器中嵌入得太深了。('model'依赖性似乎并没有完全消失)。或者,我们得到:>未捕获类型错误:this.get不是函数2。
mod=data。条目
不会刷新/重新加载把手模板。我做错了什么吗?@LéoL请查看我编辑的答案。第一件事是
成功
(不推荐使用)不能在ajax函数之外作为回调函数使用。您必须使用
done
。第二件事,因为您的模型返回一个数组,所以您必须使用循环将新对象推送到它。它表示
self.set(…)
不是一个函数。我认为控制器中的依赖性没有那么深。这很有效!!我会给你投票,但我的分数不足以做到这一点…当我收集到足够多的假互联网分数时,我会回来的:D。。。
<ul>
{{#each item in controller.queryResponse}}
    <li>item.name</li>
{{/each}}
</ul>