如何访问KnockoutJS中ViewModel之外的可观察对象?

时间:2017-10-26 00:26:38

标签: javascript html mvvm knockout.js observable

我在KnockoutJS使用data-bind View <div> <h2 data-bind="text: wTitle"></h1> <div data-bind="text: wSynopsis"></div> </div> 个元素:

ViewModel

在我的observables中,我有AJAX来控制这些元素。他们改变了元素。内容基于ViewModel对维基百科的调用。

以下是我的var ViewModel = function() { self = this; this.wTitle = ko.observable(''); this.wSynopsis = ko.observable(''); this.wikiInfo = function(i) { var wikiURL = 'https://en.wikipedia.org/w/api.php?action=opensearch&search=' + i + '&format=json&callback=wikiCallback'; $.ajax({ url: wikiURL, dataType: 'jsonp', success: function(response) { return new parseAjax(response); } }) .fail(function() { return "Error: Cannot load Wikipedia data!"; }); } this.wikiInfo(Model.currentMarker); var parseAjax = function(response) { self.wTitle(response[0]); self.wSynopsis(response[2]); }; } (我删除了任何不相关的代码):

Model

我的var Model = { currentMarker: 0 }; 位于下方(为简单起见,删除了所有不相关的代码):

observables

现在,我想访问ViewModel并从我init()之外的ViewModel之外更改其价值(即var init = function() { Model.currentMarker = marker; ko.applyBindings(new ViewModel()); } 之外的Model.CurrentMarker

ViewModel

一种方法是更改​​已在ViewModel.wikiInfo(Model.CurrentMarker)之外的View,并通知subscribe()更改,以便自动刷新ViewModel,但我认为我只能var init = function() { ViewModel.wikiInfo.subscribe(function(newValue) { Model.currentMarker = newValue; }); // Not working ko.applyBindings(new ViewModel()); } Model.CurrentMarker内的ViewModel.wikiInfo(Model.CurrentMarker)观察,我不知道如何应用它:

ViewModel

另一种方法是更改​​var init = function() { Model.currentMarker = marker; ViewModel.wikiInfo(Model.CurrentMarker); // ViewModel is not created yet ko.applyBindings(new ViewModel()); } ,然后致电ViewModel

我不能这样做,因为我无法访问init()

init()

说明:

由于其他代码要求:

  • 我无法在ViewModel的开头创建ViewModel
  • 我需要在dictionary = File.readlines(filename) sample_word = dictionary.sample.chomp until sample_word.length.between?(5, 12) sample_word = dictionary.sample.chomp end puts sample_word 之外使用chomp,我无法将其放入我的\n \r

1 个答案:

答案 0 :(得分:2)

这会有用吗?创建对ViewModel实例的引用。

var init = function() {
  Model.currentMarker = marker;
  var vm = new ViewModel();
  ko.applyBindings(vm);
  vm.wikiInfo(Model.CurrentMarker);
}