javascript - Marionette属性未定义,从API获取

标签 javascript backbone.js underscore.js marionette

我正在学习 Marionette Gentle 简介,遇到了 Single Contact API 部分的一些问题。

好吧,我们进入正题吧。

这是我的模板

        <script type="text/template" id="contact-view">
            <%= id %>
            <h1><%= firstName %> <%= lastName %></h1>
            <p><strong>Phone number:</strong> <%= phoneNumber %></p>
        </script>

这是我的 Controller 的一部分

   showContact: function(id){
        var contact = ContactManager.request('contact:model', id);
        var contactView;
        if(contact !== undefined)
        {
            contactView = new Show.Contact({
                model: contact
            });
        }
        else
        {
            contactView = new Show.MissingContact();
        }

        ContactManager.mainRegion.show(contactView);
    }

这是我的模型的一部分

Entities.Contact = Backbone.Model.extend({
    urlRoot: "php/contacts/index.php",
    defaults: {
        firstName: '',
        lastName: '',
        phoneNumber: ''
    }
});

var API = {
    getContactEntity: function(contactId){
        var contact = new Entities.Contact({id:contactId});
        contact.fetch();

        return contact;
    }
};

ContactManager.reqres.setHandler("contact:model", function(id){
    return API.getContactEntity(id);
});

这是我的 php API

$data[] = array('id'=>1, 'firstName'=>'Alice', 'lastName'=>'Arten', 'phoneNumber'=>'555-0184');
$data[] = array('id'=>2, 'firstName'=>'Bob', 'lastName'=>'Brigham', 'phoneNumber'=>'555-0184');
$data[] = array('id'=>3, 'firstName'=>'Charlie', 'lastName'=>'Campbell', 'phoneNumber'=>'555-0184');
echo json_encode($data[1]);

我试图保持简单。所以当我删除默认值时,错误如下

firstName is not defined

我尝试在模型中控制台记录联系人,请参阅此 http://prntscr.com/51k7ec

我很确定它是从 previousAttributes 获取属性而不是属性

请帮帮我。我做错什么了吗?

提前致谢

最佳答案

fetch Backbone.Model 的方法返回 jqXHR目的。 fetch 方法默认是异步的,因此您需要将回调附加到 promise从它返回,然后在该回调中您将可以访问实际获取的模型。

我建议您阅读更多有关 Deferred object 的内容。反对更深入地了解它。

对于您的问题,我建议您将 promise 对象附加到您的模型中:

var API = {
    getContactEntity: function(contactId){
        var contact = new Entities.Contact({id:contactId});
        contact.promise = contact.fetch();
        return contact;
    }
};

然后在您的 Controller 文件中使用完成回调包装渲染部分:

showContact: function(id){
    var contact = ContactManager.request('contact:model', id);
    var contactView;
    contact.promise.done(function (){
    if(contact !== undefined)
    {
        contactView = new Show.Contact({
            model: contact
        });
    }
    else
    {
        contactView = new Show.MissingContact();
    }

    ContactManager.mainRegion.show(contactView);

    });
}

在这种情况下,您的代码的某些部分将起作用。为什么有一部分?因为 else block 永远不会执行。 您的 if 语句不正确。您的模型不能未定义。它可以引发错误并停止代码的执行,但不能是未定义。如果出现错误,您可以将 fail 回调附加到您的 Promise 中并处理该情况。

如果您显示联系人并确保后端存在 id,只需删除 if 语句并使用 else 添加 fail 回调 情况下,请务必对后端 API 进行更改,以便在 id 不存在时响应 404 Not found

关于javascript - Marionette属性未定义,从API获取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26673424/

相关文章:

javascript - 在 Backbone 中将模型异步绑定(bind)到 View

javascript - 如何使用 Backbone 填充子集合?

javascript - 将更多数据添加到现有模型 (backbone.js)

javascript - 添加选项后刷新 svelte select 组件

javascript - this.setState 不会重新渲染 View ReactJS 和 Ruby on Rails

JavaScript 闪现消息

javascript - JSON:如何解析属性名称

javascript - 如何从日期数组中获取平均时间?

javascript - HTML onUnclick 处理程序?

javascript - 屏蔽输入在桌面上工作正常,在移动设备上工作正常