【问题标题】:Make Knockout.JS subscribale globally available使 Knockout.JS 订阅全球可用
【发布时间】:2017-06-02 21:59:03
【问题描述】:

我有一个 ASP.NET 应用程序,我正在使用 Knockout JS 在我的应用程序中执行一些最小的任务。但是我有一些 EditorTemplates 正在计算要显示的值。我想从其他一些 EditorTemplates 访问这些值。我想我可能会在 Knockout 中使用本机 pub/sub 功能,这意味着我会在一个 EditorTemplate 中编写通知代码,如下所示:

new ko.subscribable().notifySubscribers(this.calculatedValue, "customTopic");

然后在我的其他 EditorTemplate 中更改时接收此值

new ko.subscribable().subscribe(function (newValue) {
        alert(newValue);            
    }, this, "customTopic");

当然,这段代码不起作用,因为我每次都在创建一个new ko.subscribable()

如何创建一个在我的所有视图中都可用的ko.subscribable

【问题讨论】:

    标签: asp.net knockout.js


    【解决方案1】:
    • 首先,您需要在全局范围内定义subscribable 变量的新实例。
    • 在其他子视图模型subscribe 中到您定义的可订阅变量。
    • 在发生任何更新时使用notifySubscribers 通知任何订阅者。

    例如:https://jsfiddle.net/kyr6w2x3/149/

    查看:

     <div id="one">
        <h1>MainVM:</h1>
        <input type="text" data-bind="textInput:Name">
        <hr>
      </div>
    
      //-------------------------------------------------
      <div id="two">
        <h1>SecondVM:</h1>
        <div data-bind="text:NameSecondVM"> </div>
      </div>
    

    型号:

     var shouterValueOfName = new ko.subscribable();
    
    <script type="text/javascript">
      var MainViewModel = function(){
        var self = this;
         self.Name = ko.observable();
         self.Name.subscribe(function (newValue) {
            newValue = newValue ? newValue + " Sent from MainVM" : "" ;
            shouterValueOfName.notifySubscribers(newValue, "secondVMTakeThis");
        }, self);
      }        
    </script>
    
    <script type="text/javascript">
      var SecondViewModel = function(){
         var self = this;
         self.SecondVM = ko.observable();
         self.NameSecondVM = ko.observable();
         shouterValueOfName.subscribe(function (newValue) {
           self.NameSecondVM(newValue);
         }, this, "secondVMTakeThis");
      }
    </script>
    var viewModelA = new MainViewModel();
    var viewModelB = new SecondViewModel();
    ko.applyBindings(viewModelA, document.getElementById("one"));
    ko.applyBindings(viewModelB, document.getElementById("two"));
    

    【讨论】:

    • 这只有在单个视图中的一个 块中写入时才有效。我正在使用多个视图(多个 EditorTemplates),每个视图的末尾都有一个 块,做不同的事情。对不起,如果我听起来像个新手(我是!),但我将在哪里以及如何宣布这个全球呼喊者?我找到了关于 pub/sub 主题的教程,但我看到的每个示例都是基于在单个视图中拥有多个视图模型。
    • 查看更新后的答案。它不必位于单个 VM 内。只要您的不同脚本已加载到页面,您就可以使用它。请记住,global shouter 负责在您的虚拟机之间进行通信。您可以在全局范围内(在所有函数之外)使用var 来声明一个全局变量,它也是全局对象的属性,我们在浏览器上以window 访问
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-06
    • 2018-11-26
    • 2015-06-01
    • 1970-01-01
    相关资源
    最近更新 更多