আমার একই সমস্যা ছিল এবং আমি রাইফুংয়ের উত্তরে কোডটি নিয়ে পরীক্ষা-নিরীক্ষা করছি , এটি একটি দুর্দান্ত পরামর্শ।
তবে, আপনি না করতে চান set
নেস্টেড মডেলের সরাসরি, বা ক্রমাগত পাস করতে চান না {parse: true}
এ options
আরেকটি পদ্ধতির পুনরায় সংজ্ঞায়িত করতে হবে set
নিজেই।
ইন দাঁড়া 1.0.0 , set
বলা হয় constructor
, unset
, clear
, fetch
এবংsave
।
নীড় সুপার মডেলটি বিবেচনা করুন , নীড় মডেল এবং / অথবা সংগ্রহের প্রয়োজন এমন সমস্ত মডেলের জন্য।
/** Compound supermodel */
var CompoundModel = Backbone.Model.extend({
/** Override with: key = attribute, value = Model / Collection */
model: {},
/** Override default setter, to create nested models. */
set: function(key, val, options) {
var attrs, prev;
if (key == null) { return this; }
// Handle both `"key", value` and `{key: value}` -style arguments.
if (typeof key === 'object') {
attrs = key;
options = val;
} else {
(attrs = {})[key] = val;
}
// Run validation.
if (options) { options.validate = true; }
else { options = { validate: true }; }
// For each `set` attribute, apply the respective nested model.
if (!options.unset) {
for (key in attrs) {
if (key in this.model) {
if (!(attrs[key] instanceof this.model[key])) {
attrs[key] = new this.model[key](attrs[key]);
}
}
}
}
Backbone.Model.prototype.set.call(this, attrs, options);
if (!(attrs = this.changedAttributes())) { return this; }
// Bind new nested models and unbind previous nested models.
for (key in attrs) {
if (key in this.model) {
if (prev = this.previous(key)) {
this._unsetModel(key, prev);
}
if (!options.unset) {
this._setModel(key, attrs[key]);
}
}
}
return this;
},
/** Callback for `set` nested models.
* Receives:
* (String) key: the key on which the model is `set`.
* (Object) model: the `set` nested model.
*/
_setModel: function (key, model) {},
/** Callback for `unset` nested models.
* Receives:
* (String) key: the key on which the model is `unset`.
* (Object) model: the `unset` nested model.
*/
_unsetModel: function (key, model) {}
});
লক্ষ্য করুন যে model
, _setModel
এবং _unsetModel
উদ্দেশ্য ফাঁকা রাখা হয়। বিমূর্তির এই স্তরে আপনি সম্ভবত কলব্যাকগুলির জন্য কোনও যুক্তিসঙ্গত ক্রিয়া সংজ্ঞায়িত করতে পারবেন না। তবে আপনি তাদের সাবমোডেলগুলিতে প্রসারিত করতে ওভাররাইড করতে চাইতে পারেন CompoundModel
।
এই কলব্যাকগুলি শ্রোতাদের বাঁধা এবং change
ইভেন্টগুলি প্রচার করতে উদাহরণস্বরূপ কার্যকর are
উদাহরণ:
var Layout = Backbone.Model.extend({});
var Image = CompoundModel.extend({
defaults: function () {
return {
name: "example",
layout: { x: 0, y: 0 }
};
},
/** We need to override this, to define the nested model. */
model: { layout: Layout },
initialize: function () {
_.bindAll(this, "_propagateChange");
},
/** Callback to propagate "change" events. */
_propagateChange: function () {
this.trigger("change:layout", this, this.get("layout"), null);
this.trigger("change", this, null);
},
/** We override this callback to bind the listener.
* This is called when a Layout is set.
*/
_setModel: function (key, model) {
if (key !== "layout") { return false; }
this.listenTo(model, "change", this._propagateChange);
},
/** We override this callback to unbind the listener.
* This is called when a Layout is unset, or overwritten.
*/
_unsetModel: function (key, model) {
if (key !== "layout") { return false; }
this.stopListening();
}
});
এটির সাহায্যে আপনার স্বয়ংক্রিয় নেস্টেড মডেল তৈরি এবং ইভেন্টের প্রচার রয়েছে। নমুনা ব্যবহারও সরবরাহ করা হয় এবং পরীক্ষিত হয়:
function logStringified (obj) {
console.log(JSON.stringify(obj));
}
// Create an image with the default attributes.
// Note that a Layout model is created too,
// since we have a default value for "layout".
var img = new Image();
logStringified(img);
// Log the image everytime a "change" is fired.
img.on("change", logStringified);
// Creates the nested model with the given attributes.
img.set("layout", { x: 100, y: 100 });
// Writing on the layout propagates "change" to the image.
// This makes the image also fire a "change", because of `_propagateChange`.
img.get("layout").set("x", 50);
// You may also set model instances yourself.
img.set("layout", new Layout({ x: 100, y: 100 }));
আউটপুট:
{"name":"example","layout":{"x":0,"y":0}}
{"name":"example","layout":{"x":100,"y":100}}
{"name":"example","layout":{"x":50,"y":100}}
{"name":"example","layout":{"x":100,"y":100}}