2

我正在测试我的应用程序,所以我正在执行以下操作:

  1. 我展示了我最初加载的对象的索引视图 ( #/locators/index)LocatorApp.Locator.find();
  2. 我手动修改后端
  3. 手动(使用按钮/操作)我触发了 ember 前端中数据的刷新,而不更改路由。我用App.Locator.find().then(function(recordArray) {recordArray.update();});. 我通过控制台日志看到一个列表请求被发送到后端,并且收到了最新的数据。我假设这用于更新商店。
  4. 但是:视图不会自行更新以显示这些新数据

为什么商店收到新数据时视图不会自动更新?这不是 Ember 中数据绑定的重点吗?

如果我现在执行以下操作:

  1. 打开任何其他路线
  2. 返回定位器索引路线 ( #/locators/index)
  3. Ember 发送新请求以列出定位器
  4. 显示索引视图,其中包含正确的数据(因为它已经在商店中了?)
  5. 收到新数据

(我不是 100% 确定 4 和 5 会按此顺序发生,但我很确定)

所以,我的印象是数据在商店中得到了正确更新,但是需要以某种方式完全重新渲染视图来显示这些新数据,例如通过离开和重新进入路线。这是真的?我可以以编程方式强制重新渲染吗?

4

3 回答 3

3

当控制器更改底层模型时,Ember 更改视图数据(绑定到视图)

(仅当应用程序的状态发生更改(url 更改)路由器钩子被调用时)当您this.refesh()在路由内部执行操作时,可以通过捕获视图触发的操作来解决您的问题。

App.IndexRoute = Ember.Route.extend({
    actions: {
        dataChanged: function() {
            this.refresh();
        }
       },
       //rest of your code goes here

        });

为此,修改数据的车把模板应该有一个名为 dataChanged 的​​操作

例子 :

假设此操作负责更改/修改/删除基础数据

<button {{action 'dataChanged'}}> Change Data </button>

Refresh 方法实际上进行了模型刷新并将其传递给相应的控制器,该控制器确实改变了视图。

于 2014-07-07T17:10:21.133 回答
1

您可以尝试以下几件事:

如果您处于ArrayController强制范围内,则内容将被新数据替换:

this.replaceContent(0, recordArray.get('length'), recordArray);

或者尝试通过reload循环记录数组来调用每条记录:

App.Locator.find().then(function(recordArray) {
  recordArray.forEach(function(index, record) {
    record.reload();
  }
}

如果第二种方法有效,您还可以覆盖didLoad模型类中的钩子,而不必一个一个地循环它们:

App.Locator = DS.Model.extend({
  ...
  didLoad: function(){
    this.reload();
  }
});

如果这可行并且您需要在更多模型类中使用此行为,请考虑创建一个通用 mixin 以在更多模型类中使用:

App.AutoReloadMixin = Ember.Mixin.create({
  didLoad: function() {
    this._super();
    this.reload();
  }
});

App.Locator = DS.Model.extend(App.AutoReloadMixin, {
  ...
});

App.Phone = DS.Model.extend(App.AutoReloadMixin, {
  ...
});

更新以响应您的回答

Handlebars.registerHelper不知道绑定,我确定这会导致您的绑定不触发。您应该使用Handlebars.registerBoundHelper或简单地使用Handlebars.helper等效项:

Handlebars.helper('grayOutIfUndef', function(property, txt_if_not_def) {
  ...
});

希望这可以帮助。

于 2013-08-13T14:43:34.010 回答
0

不知何故,这似乎是由于我正在使用自定义车把助手,如下所示:

Handlebars.registerHelper('grayOutIfUndef', function(property, txt_if_not_def) {
    // HANDLEBARS passes a context object in txt_if_not_def if we do not give a default value
    if (typeof txt_if_not_def !== 'string') { txt_if_not_def = DEFAULT_UNDEFINED_STR; }
    // If property is not defined, we return the grayed out txt_if_not_def
    var value = Ember.Handlebars.get(this, property);
    if (!value) { value = App.grayOut(txt_if_not_def); }
    return new Handlebars.SafeString(value);
});

我一直在使用这样的:

{{grayOutIfUndef      formattedStartnode}

现在我已经转到一个视图:

{{view App.NodeIconView nodeIdBinding="outputs.startnode"}}

这是这样实现的:

App.NodeIconView = Ember.View.extend({
    render: function(buffer) {
        var nodeId = this.get('nodeId'), node, html;
        if (nodeId) {
            node = App.getNode(nodeId);
        }
        if (node) {
            html = App.formattedLabel.call(node, true);
        } else {
            html = App.grayOut(UNDEFINED_NODE_NAME);
        }
        return buffer.push(html);
    }
});

我不知道为什么,但似乎使用自定义车把助手打破了属性绑定机制(也许我的实现是错误的)

于 2013-08-13T15:43:51.473 回答