0

我目前正在使用带有一个视图模型的 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
        }
    });
});

有没有更好、更清洁、更有效的方法来做到这一点?

4

2 回答 2

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 -->

jsFiddle 这个答案的想法沙盒

于 2013-04-27T13:31:42.250 回答
0

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

于 2013-05-07T20:58:45.870 回答