我正在使用 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.