1

我正在使用 KnockoutJS 2.2 并尝试通过将“currentPanel”设置为显示在主模板页面上来实现应用导航

<div id="content" data-bind="template: {name: currentPanel}"></div>

因此更改路由器中的面板名称将更改显示的内容

app.Router = Backbone.Router.extend({

  routes : {
     "" : "home",
     "index.html" : "home"
  },

  home : function() {
     app.appModel.set({'panelName' : 'index-template'});
  },

这背后的模型看起来像

app.appModel = new Backbone.Model({
   panelName : 'index-template'
});

// VERSION 3: Using a simple JS object
app.AppViewModel = function(model){
  this.panelName = kb.observable(model, 'panelName');

  this.currentPanel = ko.computed(function() {
     return this.panelName();
  }, this);
}
app.appViewModel = new app.AppViewModel(app.appModel);
ko.applyBindings(app.appViewModel, $('#content')[0]);

这在不使用 requireJS 加载时非常有效。

但是 - 当我使用 require 加载我的脚本时

require.config({
  paths : {
     jquery : 'vendor/jquery-1.8.3.min',
     underscore : 'vendor/underscore',
     backbone : 'vendor/backbone',
     knockout : 'vendor/knockout-2.2.0.debug',
     knockback : 'vendor/knockback-0.17-2'
  }
});

define(['jquery', 'underscore', 'backbone', 'knockout', 'knockback'], function($, _, Backbone, ko, kb){

 // my code here....
});

使用 AMD 版本的下划线和主干 [从这里][1],据我了解 [knockoutJS 是 AMD Ready™][2]。

我在定义 'this.currentPanel' ko.computed 字段时收到此 JS 错误

Cannot write a value to a ko.computed unless you specify a 'write' option. If you wish to read the current value, don't pass any parameters.

(由于某种原因,我的 Firebug 甚至没有显示脚本窗格下的 knockout.js 库以进行调试 - 它在 Net 下加载 - 这不是我在使用集成到 Dojo 中的 requireJS 时的经验,但也许它是我的 Firebug 版本Linux)。

我还尝试了使用 jQuery 1.9 的 Knockout 2.2.1(2.2.0 与 jQuery 1.9 不兼容,因此在那里进行了更改)。

从knockoutJS代码中我可以看出,ko.computed的声明默认为只读,我试图用read_only=false属性来解决这个问题;但这似乎没有帮助,我不知道如何告诉 KO 它是可写的。

但是,由于这个错误不会出现在非 requireJS 加载情况下,我想我追错了。

任何人都可以理解这种情况下的错误吗?我是否面临一些配置问题或诚实的 KnockoutJS 问题?

- - 更新 - -

原始定义中有一个可观察到的击退,但如果我删除它并简单地使用 ko.observable,比如

// VERSION 3: Using a simple JS object
app.AppViewModel = function(model){

  this.currentPanel = ko.computed(function() {
     return 'index-template';
  }, this);
}
app.appViewModel = new app.AppViewModel(app.appModel);
ko.applyBindings(app.appViewModel, $('#content')[0]);

确切的错误仍然存​​在。

Cannot write a value to a ko.computed unless you specify a 'write' option. If you wish to read the current value, don't pass any parameters.
4

0 回答 0