【问题标题】:Access viewModel in javascript function outside viewModel's scope在 viewModel 范围之外的 javascript 函数中访问 viewModel
【发布时间】:2012-05-25 12:21:42
【问题描述】:

我想知道是否可以从 viewModel 本身范围之外的方法访问 knockout.js 主 viewModel。举个例子:

function Employee(data) {
  var self = this;
  ko.mapping.fromJS(data, {}, this);
}

function EmployeeViewModel() {
  var self = this;
  this.employees = ko.observableArray([]);

  this.loadEmployees = function() {
    var mappedEmployees= $.map(JSON.parse(data.value), function(item) { return new Employee(item) });
    self.employees (mappedEmployees);
  }
}

// here's the part I'm curious about
$(document).ready(function() {
  ko.applyBindings(new EmployeeViewModel());  

  $("#myLink").click(function() {
     // is there some way to get back into the ko context here?
     // like with ko.dataFor or ko.contextFor?
  });
}

【问题讨论】:

    标签: knockout.js data-binding scope


    【解决方案1】:

    您始终可以通过将视图模型存储在可以访问的变量中来访问它,module and revealing module patterns 很好,但您可以将其存储在不会与其他名称冲突的对象中(此处为“我的”) :

    my = { viewModel: new EmployeeViewModel() };
    ko.applyBindings(my.viewModel);
    

    您的想法是对的,您只需将元素作为 click 函数的参数并将目标属性传递给 ko.dataFor 或 ko.contextFor (jsfiddle):

    $(document).ready(function() {
        my.vm = new EmployeeViewModel();
        ko.applyBindings(my.vm);
        $('button').on('click', function(e) {
            alert('you clicked on employee ' + ko.contextFor(e.target).$data.name() +
                 ' also known as ' + ko.dataFor(e.target).name());
        });
    });​
    

    不用jQuery绑定点击事件,你总是可以使用the Knockout click binding,它将当前模型数据作为第一个参数,事件作为第二个参数(jsfiddle):

    function EmployeeViewModel() {
      var self = this;
    
      // skipped some of your code
    
      this.clickedOnEmployee = function(model, event) {
        // assuming your Employee has a name observable
        alert('You clicked on employee ' + model.name());
      };
    }
    

    在您的 html 中($root 是您的基本视图模型,如果您的 clickedOnEmployee 函数在您的 Employee 对象上,则不需要它):

    <ul data-bind="foreach: employees">
        <li>
            <span data-bind="text: name"></span>
            <button data-bind="click: $root.clickedOnEmployee">show</button>
        </li>
    </ul>
    

    【讨论】:

    • 感谢这个(正确的)答案,但我想知道是否还有一种方法可以从上下文中访问信息以供将来参考?
    • 预先添加了这些细节,ko.dataFor 和 ko.contextFor 只需要 dom 节点,您可以在处理函数中查看事件。 contextFor 结果上的 $root 将是您的视图模型
    猜你喜欢
    • 1970-01-01
    • 2018-04-07
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 2020-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多