【问题标题】:Knockout: Change observable value淘汰赛:更改可观察值
【发布时间】:2018-03-30 11:03:41
【问题描述】:

我使用 requirejs/crossroads 设置。

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

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

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

实现这种机制的正确方法是什么?

【问题讨论】:

    标签: javascript knockout.js observable


    【解决方案1】:

    请注意,在您的(简化的?)示例中,您不需要额外的方法,因为它只转发到 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));

    【讨论】:

    • 重要:我可以直接调用它,不需要类。你想改变你的例子的顺序吗?也许别人不会注意到。非常感谢您提供不同的解决方案。
    猜你喜欢
    • 2015-01-25
    • 1970-01-01
    • 1970-01-01
    • 2014-11-05
    • 2012-09-08
    • 2012-07-07
    • 2021-09-19
    • 1970-01-01
    相关资源
    最近更新 更多