使用Truffle开发投票应用时,Knockout.js Observable无法正常工作求助
解决Truffle中Knockout.js Observable失效的问题
我之前在Truffle项目里折腾Knockout时,也碰到过一模一样的Observable失效问题,给你几个实打实的排查和修复方向:
1. 先搞定Knockout的初始化时机
Truffle的app.js往往在页面DOM还没完全加载好的时候就执行了,如果你直接在ViewModel定义后就调用ko.applyBindings(),大概率会因为DOM元素还不存在导致绑定失败。
正确的做法是把绑定逻辑放在DOM加载完成的回调里:
function AppViewModel() { var self = this; // 正确定义Observable示例 self.currentVote = ko.observable(0); self.candidateList = ko.observableArray([]); // 你的业务逻辑... } // 等DOM完全就绪后再绑定ViewModel document.addEventListener('DOMContentLoaded', function() { ko.applyBindings(new AppViewModel()); });
2. 检查Observable的语法是否正确
很多时候看起来Observable没起作用,其实是语法用错了:
- 赋值必须用括号传参:
self.currentVote(15)(不是self.currentVote = 15,这会把它变成普通变量) - 取值也要用括号:
console.log(self.currentVote()) - HTML绑定里直接写变量名:
<div data-bind="text: currentVote"></div>
3. 避免和Truffle默认的App对象冲突
你代码里提到了App = { ... },但Truffle默认的app.js里已经有一个全局的App对象,同名变量很容易导致作用域混乱,把你的ViewModel包裹在独立作用域里:
(function() { function AppViewModel() { var self = this; // 你的ViewModel逻辑... } document.addEventListener('DOMContentLoaded', function() { ko.applyBindings(new AppViewModel()); }); })();
4. 确认Knockout库的引入顺序
检查你的index.html,必须先引入Knockout,再引入Truffle的app.js:
<!-- 先加载Knockout --> <script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.5.1/knockout-latest.min.js"></script> <!-- 再加载Truffle的app.js --> <script src="js/app.js"></script>
如果是本地引入,要确认文件路径正确,打开浏览器控制台(F12)看看有没有404错误。
5. 用控制台快速验证Observable是否正常
打开开发者工具控制台,手动创建ViewModel实例测试:
var vm = new AppViewModel(); vm.currentVote(20); console.log(vm.currentVote()); // 如果输出20,说明Observable本身没问题,问题出在DOM绑定环节
要是这一步正常,就去检查HTML里的data-bind属性有没有拼写错误,或者绑定的元素是否存在。
内容的提问来源于stack exchange,提问作者Masnad Nihit
相关产品推荐
相关产品推荐

