秘银 - 重新渲染动态内容

时间:2015-11-01 22:26:20

标签: javascript request deferred mithril.js

我想在延迟对象返回数据后重新渲染我的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),
                        ])
                    });
                }))
            ])
        ]),

2 个答案:

答案 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的机制,这可能与此有关。