gpt4 book ai didi

javascript - Angular2 类不公开函数

转载 作者:行者123 更新时间:2023-11-30 00:15:39 25 4
gpt4 key购买 nike

我有这个模型:

(function(app) {
app.productLine =
ng.core.Component({
selector: 'product-line',
templateUrl: 'templates/sales-product.html',
})
.Class({
constructor: function() {
this.products = [new app.product('101010101010101', '1', '19.99')];
},

addLine: function() {
this.products.push(new app.product('101010101010101', '1', '19.99'));
}
});

})(window.app || (window.app = {}));

(function(app) {
app.product = function (upc, quantity, price) {
this.upc = upc;
this.quantity = quantity;
this.price = price;
return this;
}
})(window.app || (window.app = {}));

但是,我不知道如何公开 addLine() 以便我可以在别处调用它。

记录 productLine 仅显示构造函数:

console.log(app.productLine);
function app.productLine<.constructor()

调用 app.productLine.addLine() 会得到 TypeError: app.productLine.addLine is not a function.

编辑:

我发现直接将 addLine 函数添加到 app.productLine 确实有效。当然,this的范围发生了变化,所以需要在更明显的位置引用构造函数的结果。

(function(app) {
app.productLine =
ng.core.Component({
selector: 'product-line',
templateUrl: 'templates/sales-product.html',
})
.Class({
constructor: function () {
this.products = [
{ upc: '',
quantity: '',
price: ''
}
];

app.productLine.products = this.products;
}
});

app.productLine.add = function (upc, quantity, price) {
app.productLine.products.push({
upc: upc,
quantity: quantity,
price: price
});
}

})(window.app || (window.app = {}));

然后您可以运行 app.productLine.add(123,456,789); 并更新模型。

但是, View 不会立即更新。我认为有必要以某种方式触发更新,但是使用 2 向数据绑定(bind),如果您使用 UI 更新模型,所有更新都会出现。

最佳答案

如果您想公开多个组件可以使用的共享功能,我建议实现一个服务并将其注册到应用程序级注入(inject)器。

Demo Plnkr

产品类别和产品服务

var Product = ng.core.Class({
constructor: function (upc, quantity, price) {
this.upc = upc;
this.quantity = quantity;
this.price = price;
}

});
var ProductService = ng.core.Class({
constructor: function() {
this.products = [new Product('101010101010101', '1', '19.99')];
},

addLine: function () {

this.products.push(new Product('101010101010101', '1', '19.99'));
}
});

使用应用程序级注入(inject)器注册 ProductService

(function(app) {
document.addEventListener('DOMContentLoaded', function() {
ng.platform.browser.bootstrap(app.AppComponent, [ProductService]);
});
})(window.app || (window.app = {}));

在组件构造函数中注入(inject) ProductService 并调用 AddLine

(function(app) {
app.AppComponent =
ng.core.Component({
selector: 'app',
directives: [app.ProductLine],
template: '<h1>Anguar 2</h1> <button (click)="addLine()">Add Line</button> <ul><li *ngFor="#product of service.products"><product-line [product]="product"></product-line></li></ul>'
})
.Class({
constructor: [ProductService, function (service) {
this.service = service;
}],
addLine: function () {
this.service.addLine();
}
});
})(window.app || (window.app = {}));

具有产品输入绑定(bind)的 ProductLine 指令

该指令由父组件使用。

(function(app) {
app.ProductLine =
ng.core.Component({
selector: 'product-line',
inputs: ['product'],
template: 'UPC:{{product.upc}}<br> Price:{{product.price}}<br>Qty:{{product.quantity}}',
})
.Class({
constructor: function () {
}
});
})(window.app || (window.app = {}));

ProductService 是一个单例。任何组件都可以注入(inject) ProductService 并调用 AddLine() 并且任何绑定(bind)到 products 的组件都将作为默认更改检测的一部分自动更新策略。

关于javascript - Angular2 类不公开函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34830534/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com