【发布时间】:2019-01-26 15:02:41
【问题描述】:
我有两个modalviews - MyModalViewA(父)和MyModalViewB(子)。
MyModalViewA 生成 MyModalViewB,作为自定义绑定,还有我需要更新的可观察数组。它看起来像:
(function () {
'use strict';
var
window = __webpack_require__(/*! window */ 10),
_ = __webpack_require__(/*! _ */ 2),
$ = __webpack_require__(/*! $ */ 12),
ko = __webpack_require__(/*! ko */ 3),
key = __webpack_require__(/*! key */ 16),
Enums = __webpack_require__(/*! Common/Enums */ 4),
Utils = __webpack_require__(/*! Common/Utils */ 1),
Links = __webpack_require__(/*! Common/Links */ 13),
Remote = __webpack_require__(/*! Remote/User/Ajax */ 14),
kn = __webpack_require__(/*! Knoin/Knoin */ 5),
AbstractView = __webpack_require__(/*! Knoin/AbstractView */ 11),
AttachmentModel = __webpack_require__(/*! Model/Attachment */ 86)
;
function MyModalViewA()
{
...some observables...
//data response which must be updated
this.rows= ko.observableArray([]);
this.getResults = Utils.createCommand(this, function()
{
kn.showScreenPopup(__webpack_require__(/*! View/Popup/SearchUsers */ 171),[oData]);
}
}
kn.constructorEnd(this);
}
module.exports = MyModelViewA;
}());
然后MyModelViewB:
(function () {
'use strict';
var
window = __webpack_require__(/*! window */ 10),
_ = __webpack_require__(/*! _ */ 2),
$ = __webpack_require__(/*! $ */ 12),
ko = __webpack_require__(/*! ko */ 3),
key = __webpack_require__(/*! key */ 16),
Enums = __webpack_require__(/*! Common/Enums */ 4),
Utils = __webpack_require__(/*! Common/Utils */ 1),
Links = __webpack_require__(/*! Common/Links */ 13),
Remote = __webpack_require__(/*! Remote/User/Ajax */ 14),
kn = __webpack_require__(/*! Knoin/Knoin */ 5),
AbstractView = __webpack_require__(/*! Knoin/AbstractView */ 11),
AttachmentModel = __webpack_require__(/*! Model/Attachment */ 86)
;
function MyModalViewB()
{
...some observables...
this.doSearch = Utils.createCommand(this, function()
{
MyModelViewB.findUsers(userId);
}
kn.constructorEnd(this);
}
MyModelViewB.findUsers = function (userId)
{
//here I'm retriewing rows
//and I need I need to update rows from MyModalViewA
}
module.exports = MyModelViewB;
}());
然后根据Whats the best way of linking/synchronising view models in Knockout? 的回答,我尝试使用PubSub 从MyModelViewA 更新this.rows= ko.observableArray([]);。
为此,我已将 var postbox = ko.observable(); 添加到 MyModelViewA 构造函数变量。然后在MyModelViewA我加了
postbox.subscribe(function(newValue) {
this.rows.push(newValue);
}, this);
在MyModelViewB之后我添加了
this.results = ko.observableArray([]);
this.results.subscribe(function(newValue) {
postbox.notifySubscribers(newValue);
});
但是当我将newValue 硬编码到MyModelViewB 中时,两个视图都没有得到newValue 既不是MyModelViewB 也没有更新MyModelViewA this.rows 可观察到的。
那时我不确定我是否从上面提到的链接中得到了正确的答案才能让它工作。
编辑
我已经添加到我的模块包代码的顶部
var postbox = new ko.subscribable();
如下代码
(function($) { $(function() {
window.postbox = new ko.subscribable();
});
});
在尝试声明可订阅时抛出错误
无法读取未定义的属性“订阅”
然后在 MyModalViewA 的模块中添加了 PFX 答案的简化版本:
postbox.subscribe(function(newValue) {
self.myTest(newValue);
console.log('New value: ' + newValue);
}, null, "NewRowAvailable"
);
并在MyModalViewB 的模块中添加MyModelViewB.findUsers 下
var newRow = "testing123";
postbox.notifySubscribers(newRow, "NewRowAvailable");
当我调试该代码时,它显示postbox 被定义为Object {NewValueAvailable: },但notifySubscribers 没有更新可订阅。
想法?
【问题讨论】:
-
如果父模型负责生成子模型,我会在构造函数中传递对
rows数组的引用。 -
@user3297291 当我尝试在子模型中访问
this.rows时,它说是undefinied
标签: javascript arrays knockout.js observable model-view