0

当我的收藏被提取时,服务器会向我发送last_namefirst_nameSpear_first_name(以及对问题不重要的其他属性)。

我希望能够添加一个名为mailing_name的属性,该属性本质上是:

var setNameOnFormAttribute = this.get("last_name") + ", " + this.get("last_name");

if (!_.isNull(this.get("spouse_first_name")) || !_.isEmpty(this.get("spouse_first_name"))) {
setNameOnFormAttribute += " & " + this.get("spouse_first_name");
}

我想确保如果任何基本属性(last_namefirst_nameSpear_first_name)由于任何原因发生更改,自定义mailing_name属性会更新,并且使用mailing_name属性的任何视图都会更新。

如果这有所作为,我正在使用backbone.marionette。

编辑 1

我的第一次尝试:

define([
    'backbone'
],
function( Backbone ) {
    'use strict';

    /* Return a model class definition */
    return Backbone.Model.extend({
        initialize: function (){
            console.log(this.attributes);
            
            this.bind("change:last_name", this.setNameOnFormAttribute);
            this.bind("change:first_name", this.setNameOnFormAttribute);
            this.bind("change:spouse_first_name", this.setNameOnFormAttribute);
        },

        setNameOnFormAttribute: function(){
            var name_on_form = this.get("last_name") + ", " + this.get("first_name");

            if (!_.isNull(this.get("spouse_first_name")) || !_.isEmpty(this.get("spouse_first_name"))) {
                name_on_form += " & " + this.get("spouse_first_name");
            }

            this.set("name_on_form", name_on_form);
        }
    });
});

如果 ind 奇怪的是,初始化函数开头的 console.log 显示所有属性都已设置。因此属性上的更改事件不会触发,因此我无法注入新属性。

我可能在这里采取了错误的方法......

编辑 2 以回答 Bernardo 的问题

它与木偶视图相连。集合是从复合视图中获取的,集合只是定义了适当的模型。

define([
    'backbone',
    'collections/tasks',
    'views/item/task',
    'views/item/tasklist_empty',
    'hbs!tmpl/layout/tasklist_tmpl'
],
function( Backbone, TasksCollection, TaskView, tasklistEmptyView, TasklistTmpl  ) {
    'use strict';

    return Backbone.Marionette.CompositeView.extend({

        initialize: function() {
            this.collection = new TasksCollection();
            this.collection.bind("reset", _.bind(this.render, this));
            this.collection.fetch({ reset: true });
        },

        itemView: TaskView,
        emptyView: tasklistEmptyView,

        template: TasklistTmpl,

        itemViewContainer: ".tasks"

    });

});


define([
    'backbone',
    'moment',
    'application',
    'models/task'
],
function( Backbone, moment, App, Task ) {
    'use strict';

    /* Return a collection class definition */
    return Backbone.Collection.extend({
        initialize: function() {
        },

        comparator: function(model) {
            return moment(model.get('received_date')).unix();
        },

        model: Task,

        url: App.apiUrl + '/tasks'

    });
});
4

2 回答 2

1

已编辑

我看到您确实在使用 a fetch,但正在使用该reset选项。如果您查看add被调用函数的主干注释代码,它基本上会添加silent: true到下游发送的选项中。然后将其发送到_preparemodel函数,并导致集合中的所有子模型都使用 来创建silent: true,因此您会看到属性集,而永远不会看到更改事件触发。fetch在with reset 选项之后,您需要在模型上手动引发该事件。

就目前而言,我认为您只需要手动触发该事件,并可能修复您的逻辑setmailtoname,或者什么不是,函数只使用!_isEmpty或更改短路或与。我不会在初始化中添加对 set mail_to_name 的调用,因为如果您将其更改为 fetch without set 等,它将触发两次。

这是一个带有更改的新jsfiddle和它们的演示。也是用于测试的同步重定向。

我基本上将其添加到您的 Collection 模型中。可能有更好的方法,但我只看了几天主干。

initialize: function () {
    this.bind("reset", function () {
        _.each(this.models, function (model) {
            model.setNameOnFormAttribute.apply(model, arguments);
        });
    });

编辑结束:剩下的只是信息。

我假设这些数据不是来自 afetch或其他东西,因为您正在检查initialize函数中的属性?那不会在 a 上执行fetch,对吧?

假设不是:

在映射属性进行更改之前,事件不会触发,因此我setNameOnForminitialize函数中调用了 。在提供的代码中,我将其设置options{ silent: true }不发送“更改”触发器,但您可能希望根据您的使用情况将其删除。

假设它被提取

设置的功能会出错吗?您可以在那里登录以查看它是否被调用以及它是否返回正确的值?我认为该功能应该是下面的功能。您可能对||而不是&&

jsfiddle

我还添加了处理options参数的能力[直接调用或从调用传递到观察集[例如。aModel.set("last_name");] 然后通过Backbone.Model.trigger函数作为第三个参数发送到方法。

我用一些 hacky 日志记录了一个jsfiddle 。我不知道如何使用木偶,对不起。我还没有通过功能更改对其进行更新。

于 2013-09-26T06:05:38.113 回答
0

如果您在此处查看 Backbone 源代码:

http://documentcloud.github.io/backbone/docs/backbone.html#section-28

您可以看到模型属性在调用初始化之前在 Backbone.Model 构造函数中设置。

但是,这与您的情况下未触发的更改事件无关:您的更改事件应该在从服务器获取模型数据后触发,并且您的绑定应该触发要设置的复合属性。

到目前为止,您的代码看起来正确 - 您如何初始化模型、视图和获取数据?

于 2013-09-25T21:21:40.920 回答