淘汰赛:改变可观察的价值

时间:2017-10-18 14:20:19

标签: javascript knockout.js observable

我使用requirejs / crossroads设置。

这是我的一些全局属性的引导:

ko.applyBindings({
    route: router.currentRoute,
    user: {
        ...
    },
    ...
    loading: ko.observable(false),
    setLoadingState: function(newState) {
        this.loading(newState);
    }
});

从组件调用setLoadingState函数(通过params传递)时,它告诉我loading不是函数/ undefined

实施此类机制的正确方法是什么?

1 个答案:

答案 0 :(得分:3)

请注意,在您的(简化?)示例中,您不需要其他方法,因为它只转发到loading,可以直接调用。

使用类似模式的类来确保this引用您的视图模型,如下所示:

var MyApp = function(router) {
  this.route = router.currentRoute,
  this.loading = ko.observable(false);
};

MyApp.prototype.setLoadingState = function(newState) {
    this.loading(newState);
};


ko.applyBindings(new MyApp(router));

(您也可以使用更现代的class语法)

或者,通过“工厂”功能使用普通对象:

var MyApp = function(router) {
  var route = router.currentRoute,
  var loading = ko.observable(false);
  var setLoadingState = function(newState) {
    loading(newState);
  };
  
  // Expose what you want to expose:
  return {
    loading: loading,
    setLoadingState: setLoadingState
  };
};

ko.applyBindings(MyApp(router));