【问题标题】:Running an ember controller function when route loads to set property that controls a checkbox在路由加载以设置控制复选框的属性时运行 ember 控制器功能
【发布时间】:2013-08-13 01:14:56
【问题描述】:

我已经设置了一个 ember 复选框:

{{view Ember.Checkbox checkedBinding='isChecked'}}

此复选框绑定到此控制器:

App.SettingsController = Ember.Controller.extend({

isChecked: false,
isItChecked: function(){

    var me = this;
    $.getJSON('ajax/checkIfUseLowRes.php', function(data){
        //console.log(data);
        //me.isChecked = data;
        me.set('isChecked', data);
        //console.log(me.isChecked);

    })

},
sendSetting: function(){

    var isChecked = this.isChecked;
    //this.set('isChecked', !isChecked);
    console.log(isChecked);

    $.post('ajax/setLowRes.php', {useLowRes: isChecked});
    App.nameSpace.set('needsRefresh', true);

}.observes('isChecked')


});

本质上它是一个发布设置的复选框,我的问题是设置复选框的原始状态。当我加载路线时,我想让isItChecked() 运行以设置复选框的原始状态。

示例: 1.我进入设置,点击复选框 2. 我离开网站并返回设置页面 这是我希望运行isItChecked() 函数以查询服务器并查看设置是否设置的地方

如果设置了,get 请求返回 true,我希望复选框被选中,因此将 me.isChecked 设置为 data (true)

目前我无法弄清楚如何做到这一点,有人可以帮助我吗?

我尝试在我的App.SettingsRoute 的模型中设置它,但这似乎无法在我的控制器中运行该功能。

谢谢。

JSBin:http://jsbin.com/ukuwiq/1/edit

【问题讨论】:

    标签: javascript checkbox ember.js


    【解决方案1】:

    实现此目的的一种方法是使用路由的 setupController 方法。

    App.SettingsRoute = Ember.Route.extend({
      setupController: function(controller, model) {
        $.getJSON('ajax/checkIfUseLowRes.php', function(data){
          console.log('setting isChecked to: ', data);
          controller.set('isChecked', data);
        })
      }
    })
    

    这应该可以通过对现有代码的最少更改来完成工作,但确实有一些缺点,并且不完全是 the-ember-way。拥有一个代表您的设置的模型对象可能更有意义,将 ajax 代码移动到该模型对象并根据需要使用路由的模型挂钩来触发。请参阅 ember-without-ember-data 了解其工作原理的示例。

    【讨论】:

    • 谢谢!这很有帮助。
    【解决方案2】:

    正如 Mike 所说,您可以使用“setupController”,也可以使用这个:

    App.SettingsRoute = Ember.Route.extend({
      activate: function() {
        this.controllerFor('settings').isItChecked();
      }
    })
    

    【讨论】:

    • 不应该是this.controllerFor('settings').send('isItChecked');吗?
    【解决方案3】:

    你不能只使用init函数吗?例如

    App.IndexController = Ember.ObjectController.extend({
        init: function() {
        console.log("function run");
    },
    

    【讨论】:

    • 这只会执行一次,而不是每次显示控制器时。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-30
    • 1970-01-01
    • 1970-01-01
    • 2016-07-03
    相关资源
    最近更新 更多