【发布时间】:2015-10-26 03:30:15
【问题描述】:
我正在使用 AngularJS 服务来存储来自多个页面的数据,以便一起提交。请参阅下面的代码。
在我的 Chrome 控制台中,如果我观察到 checkoutData.shipping,我会返回带有数据的正确对象。如果我观察checkoutData.data 我得到一个空对象,它的运输属性是空白的。
这些应该指向同一个对象,对吧?为什么它可以使用 .shipping 而不是 .data?设置这种方式的原因是运输页面只关心 .shipping,而最终页面需要 .data 中的所有内容。
(function() {
angular.module('app').factory('checkoutData', [function() {
var data = {
carrierId: null,
serviceTypeId: null,
shippingCost: {},
billingOptionId: null,
shipping: {},
billing: {},
cart: null
};
var inputForms = {};
var options = {
shippingOptions: null,
billingOptions: null,
selectedShippingOption: null
};
var staticContent = {
billing: {},
cart: {},
shipping: {}
};
return {
data: data,
shipping: data.shipping,
inputForms: inputForms,
cart: data.cart,
billingOptionId: data.billingOptionId,
billingOptions: options.billingOptions,
carrierId: data.carrierId,
serviceTypeId: data.serviceTypeId,
shippingOptions: options.shippingOptions,
staticContentBilling: staticContent.billing,
staticContentCart: staticContent.cart,
staticContentShipping: staticContent.shipping,
selectedShippingOption: options.selectedShippingOption,
setValid: function(formName, valid) {
inputForms[formName].valid = valid;
},
initializeForm: function(formName) {
inputForms[formName] = {};
},
formInitialized: function (formName) {
return inputForms[formName] != null;
}
}
}]);
})();
【问题讨论】:
-
从哪里控制它们的价值,一个控制器?
-
如果您在控制器中使用您的工厂,您将获得
checkoutData.shipping一个空对象,因为它是空的,而对于checkoutData.data,您将获得对象{shippingCost: {...}, shipping: {...}, ... }请看看在这个jsfiddle。 -
我无法重现您的问题。
checkoutData.shipping和checkoutData.data.shipping在出厂时没有任何区别。你如何“观察”这些价值观?什么时候? -
你确定你是在工厂里操作你的
shipping对象,而不是把它重新分配给别的东西吗?在代码中的其他任何地方执行checkoutData.shipping = x会破坏对内部data变量的引用。也许您根本不应该公开属性,而应该为它们设置 getter 和 setter? -
另外,您可以创建两个使用相同数据模型但以不同方式输出数据的工厂,一种方式用于您的运输页面,另一种方式用于“最终”页面。您的问题是双重的:数据绑定和尝试创建可以以多种不同方式使用的万能数据。为什么不修改结束页面以在您使用数据时以相同的方式使用数据?乱搞这些乱七八糟的东西似乎相当愚蠢,而且正如你所看到的那样,过于复杂了。
标签: javascript angularjs angularjs-service