【问题标题】:Update Firebase ref for KnockoutFire observable after bindings have been applied应用绑定后更新可观察到的 KnockoutFire 的 Firebase ref
【发布时间】:2013-05-08 04:58:45
【问题描述】:

我目前正在使用带有一个视图模型的 KnockoutJS,该视图模型具有我的站点所需的所有属性。当我一开始初始化视图模型时,我确保将 null observables 分配给相关属性,以便稍后更新它们时,将触发事件。我正在尝试对 knockoutfire 集合做同样的事情——特别是我想在用户登录后加载数据而不必重新应用绑定——但是当我这样做时感觉有点沉重。这就是我所拥有的,也是我真正能够让它在以后不重新应用绑定的情况下工作的唯一方法:

// init view model
var viewModel = {
    prop1: ko.observable(null),

    firebase1: KnockoutFire.observable(recommenderFirebase.child('ratings/suggestions'), {
        '.limit': 0,
        "$suggestion" : {
            accountID: true,
            itemID: true,
            relevance: true
        }
    });
}

// apply all bindings for life of app
ko.applyBindings(viewModel);

// login user and re-populate firebase1
firebaseOOO.initAuthClient(function(user) {
    viewModel.firebase1 = KnockoutFire.observable(recommenderFirebase.child('ratings/suggestions').child(user.id), {
        '.limit': 20,
        "$suggestion" : {
            accountID: true,
            itemID: true,
            relevance: true
        }
    });
});

有没有更好、更清洁、更有效的方法?

【问题讨论】:

    标签: javascript knockout.js


    【解决方案1】:

    使用包装器 observable 然后在登录后替换 observable 的值怎么样?

    首先,applyBindings viewModel 如下:

    var viewModel = {
      prop1: ko.observable(null),
      afterLogin: ko.observable(null)
    };
    

    然后登录后,设置afterLogin新结构:

    viewModel.afterLogin({
      firebase1: KnockoutFire.observable(…)
    });
    

    对应的视图可能如下所示:

    <!-- ko with: afterLogin -->
      <ul data-bind="foreach: firebase1">
        <li><span data-bind="text: accountID"></span></li>
      </ul>
    <!-- /ko -->
    

    An idea sandbox of this answer at jsFiddle.

    【讨论】:

    • 效果很好,渲染效率更高,谢谢!如果有人在尝试它,它的工作原理有点不直观 - 请注意您在 html 中引用“firebase1”,而不是像往常那样引用“afterLogin”。
    【解决方案2】:

    添加放大 js 以轻松跟踪松散耦合的发布/订阅事件。在登录前定义(订阅)事件,然后在登录时发布事件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-27
      • 1970-01-01
      • 2013-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-18
      相关资源
      最近更新 更多