首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从嵌套函数访问父属性?

如何从嵌套函数访问父属性?
EN

Stack Overflow用户
提问于 2012-11-18 20:03:28
回答 3查看 1.6K关注 0票数 0

拜托,有人能帮我吗?

在执行create方法时,我得到了以下错误:

代码语言:javascript
复制
*Uncaught TypeError: Object #<Object> has no method 'baseUri'*

通过以下绑定调用此方法:

代码语言:javascript
复制
<form id="createProducts" data-bind="submit: products.create">

当执行read方法(从PreLoad方法调用)时,baseUri和items都可用。

当视图模型被定义为一个函数时,我找到了解决这个问题的方法,但在我的例子中,它被定义为一个对象。

这是我的完整JS文件

代码语言:javascript
复制
var mm = {

    /* Products ********************************************************** */

    products: {

        items: ko.observableArray([]),

        read: function () {
            $.getJSON(this.baseUri(), this.items);
        },

        create: function (formElement) {

            $.post(this.baseUri(), $(formElement).serialize(), null, "json")
                .done(function (o) {                    
                    alert("The Product " + o.Name + " was created.");
                    this.items.push(o);
                });
        },

        baseUri: function () { return BASE_URI; }
    }

};

function PreLoad() {

    mm.products.read();

    ko.applyBindings(mm);
}

  • BASE_URI 是在母版页中定义的一个全局变量,我需要它,因为我有多个嵌套的视图模型(我从这段代码中删除了它们),而且每个baseUri都是BASE_URI+ "some_string_value“的组合。无论如何,我也需要访问items,以便更新列表中显示的值。

谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-11-19 21:22:53

在绑定事件时,有两种方法可以确保this是正确的。

第一个是使用bind

代码语言:javascript
复制
<form id="createProducts" data-bind="submit: products.create.bind(products)">

第二种方法是使用内联函数:

代码语言:javascript
复制
<form id="createProducts" data-bind="submit: function() { products.create(); }">

这种行为将来可能会改变(请参阅https://github.com/SteveSanderson/knockout/issues/378)。

编辑

有两种解决方案可以使this在回调函数中可用。第一种方法是将this复制到通过闭包可用的局部变量。

代码语言:javascript
复制
        var self = this;
        $.post(this.baseUri(), $(formElement).serialize(), null, "json")
            .done(function (o) {                    
                alert("The Product " + o.Name + " was created.");
                self.items.push(o);
            });

第二种方法是对回调函数使用bind

代码语言:javascript
复制
        $.post(this.baseUri(), $(formElement).serialize(), null, "json")
            .done(function (o) {                    
                alert("The Product " + o.Name + " was created.");
                this.items.push(o);
            }.bind(this));
票数 0
EN

Stack Overflow用户

发布于 2012-11-19 01:57:28

我有一种感觉,当你打电话给this时,products.create不是你想的那样。尝试使用.bind显式设置上下文:

代码语言:javascript
复制
<form id="createProducts" data-bind="submit: products.create.bind($data)">
票数 0
EN

Stack Overflow用户

发布于 2012-11-19 08:54:18

正如安德鲁·惠特克( Andrew )已经提到的那样--“这”将不是你所期待的背景。我的解决方案是存储"this“引用(如称为"self"),并使用它而不是"this":

代码语言:javascript
复制
products: {
    self: undefined,
    items: ...,
    init: function() { 
        this.self = this; 
    },
    read: function () {$.getJSON(self.baseUri(), self.items);},
    create: function () {
        $.post(self.baseUri(), $(formElement).serialize(), null, "json")
            .done(function (o) {                    
                alert("The Product " + o.Name + " was created.");
                self.items.push(o);
            });
    },
    baseUri: function () { return BASE_URI; }
};

function PreLoad() {

    mm.products.init();
    mm.products.read();

    ko.applyBindings(mm);
}

您还可以显式地指示应该在哪个上下文函数中调用:

代码语言:javascript
复制
<form id="createProducts" data-bind="submit: function () { products.create($root.products); }">

products: {
    create: function(self) {
        ...
    }

在这种情况下,$root应该指向您的视图模型,因此您将传递products对象的实例来创建函数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13444045

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档