我想在延迟对象返回数据后重新渲染我的DOM elemnets。我在控制台上调试它,看起来我的元素正在创建,但它永远不会显示到页面。如果我添加静态内容,它将按预期工作。
m('div', {class: 'table-responsive'}, [
m('table', {class: 'table'}, [
m("thead", [
m('tr', [
m('th', '#'),
m('th', 'Groups'),
])
]),
m('tbody', findGroupsDeferred.promise.then(function(data){ // findGroupsDeferred returns when the promise is complete with my data.
data.group.map(function(group) {
return m("tr", [
m("td", [
m("input[type=checkbox] checked", {
value: group,
onclick: function (event) {
if (event.target.checked) {
ctrl.addGroup(ctrl.groups(event.target.value))
} else {
ctrl.removeGroup(ctrl.groups(event.target.value))
}
}
})
]),
m("td", group),
])
});
}))
])
]),
答案 0 :(得分:2)
Roamer-1888是对的。这在视图中无法完成。你有几个选择来实现这个目标:
首先是等待控制器中的结果:
controller: function() {
scope = {
groups: []
}
findGroupsDeferred.promise.then(function(data) {
scope.groups = data.group;
}
return scope;
},
view: function(scope) {
return scope.groups.map(function(group) {
return group.name // or what ever you want to do here
}
}
另一种选择是为此创建component,这几乎导致相同的代码接受它的封装。第三种选择是将m.prop
与mithrils一起使用。
答案 1 :(得分:1)
我不知道秘银,但会猜测承诺不能以这种方式使用。
从承诺的第一原则来看,用m()
包装整个promise.then(...)
表达式会更有意义。换句话说,在findGroupsDeferred.promise
结算后构建整个表,而不是尝试定位表的内部部分。
findGroupsDeferred.promise.then(function(data) { // findGroupsDeferred returns when the promise is complete with my data.
m('div', {class: 'table-responsive'}, [
m('table', {class: 'table'}, [
m("thead", [
m('tr', [
m('th', '#'),
m('th', 'Groups'),
])
]),
m('tbody', data.group.map(function(group) {
return m("tr", [
m("td", [
m("input[type=checkbox] checked", {
value: group,
onclick: function (event) {
if (event.target.checked) {
ctrl.addGroup(ctrl.groups(event.target.value));
} else {
ctrl.removeGroup(ctrl.groups(event.target.value));
}
}
})
]),
m("td", group),
]);
}))
])
]),
});
另外,秘银有rendering before web service requests finish的机制,这可能与此有关。