newTestSet("Module provider plug-ins");
asyncTest("Overriden load: is called when calling module.provide, with the correct identifier", function () {
var identifierLoadWasCalledWith = null;
var originalModuleLoad = module.constructor.prototype.load;
module.constructor.prototype.load = function (moduleIdentifier, onModuleLoaded) {
identifierLoadWasCalledWith = moduleIdentifier;
originalModuleLoad(moduleIdentifier, onModuleLoaded);
};
module.declare([], function () {
module.provide(["demos/math"], function () {
strictEqual(identifierLoadWasCalledWith, "demos/math", "The overriden version of module.load was called with the same module identifier as was passed to the un-overriden module.provide.");
module.constructor.prototype.load = originalModuleLoad;
start();
});
});
});
test("Overriden provide: is called to provide the unmemoized dependencies when declaring the main module", function () {
var idsOfModulesProvideIsCalledOn = [];
var dependenciesProvideWasCalledWith = [];
var originalModuleProvide = module.constructor.prototype.provide;
module.constructor.prototype.provide = function (dependencies, onAllProvided) {
idsOfModulesProvideIsCalledOn.push(this.id);
dependenciesProvideWasCalledWith = dependenciesProvideWasCalledWith.concat(dependencies);
onAllProvided();
};
require.memoize("dependency/1", [], function () { });
module.declare(["dependency/1", "dependency/2"], function () {
ok(idsOfModulesProvideIsCalledOn.indexOf("") !== -1, "The overriden version of module.provide was called with this.id set correctly");
ok(dependenciesProvideWasCalledWith.indexOf("dependency/2") !== -1, "The overriden version of module.provide was called for the un-memoized dependency");
});
module.constructor.prototype.provide = originalModuleProvide;
});
asyncTest("Overriden provide: is called to provide the un-memoized dependencies of a memoized dependency of a memoized dependency of the main module", function () {
var idsOfModulesProvideIsCalledOn = [];
var dependenciesProvideWasCalledWith = [];
var originalModuleProvide = module.constructor.prototype.provide;
module.constructor.prototype.provide = function (dependencies, onAllProvided) {
idsOfModulesProvideIsCalledOn.push(this.id);
dependenciesProvideWasCalledWith = dependenciesProvideWasCalledWith.concat(dependencies);
originalModuleProvide.call(this, dependencies, onAllProvided);
};
require.memoize("deeperDependency", ["demos/math"], function () { });
require.memoize("dependency", ["deeperDependency"], function () { });
require.memoize("memoized", ["dependency"], function () { });
module.declare(["memoized"], function () {
ok(idsOfModulesProvideIsCalledOn.indexOf("deeperDependency") !== -1, "The overriden version of module.provide was called with this.id set to that of the two-levels-deep dependency");
ok(dependenciesProvideWasCalledWith.indexOf("demos/math") !== -1, "The overriden version of module.provide was called for the un-memoized dependency");
module.constructor.prototype.provide = originalModuleProvide;
start();
});
});
asyncTest("Overriden provide: works even with circular dependencies", function () {
var idsOfModulesProvideIsCalledOn = [];
var dependenciesProvideWasCalledWith = [];
var originalModuleProvide = module.constructor.prototype.provide;
module.constructor.prototype.provide = function (dependencies, onAllProvided) {
idsOfModulesProvideIsCalledOn.push(this.id);
dependenciesProvideWasCalledWith = dependenciesProvideWasCalledWith.concat(dependencies);
originalModuleProvide.call(this, dependencies, onAllProvided);
};
module.declare(["demos/circular/circularA"], function () {
ok(idsOfModulesProvideIsCalledOn.indexOf("demos/circular/circularA") !== -1, "The overriden version of module.provide was called with this.id set to that of the module the main module depends on");
ok(dependenciesProvideWasCalledWith.indexOf("demos/circular/circularB") !== -1, "The overriden version of module.provide was called to provide the other module in the circular dependency chain");
module.constructor.prototype.provide = originalModuleProvide;
start();
});
});
asyncTest("Overriden provide: works even with circular dependencies where the plug-in provides a normally nonextant module", function () {
var idsOfModulesProvideIsCalledOn = [];
var dependenciesProvideWasCalledWith = [];
var originalModuleProvide = module.constructor.prototype.provide;
module.constructor.prototype.provide = function (dependencies, onAllProvided) {
idsOfModulesProvideIsCalledOn.push(this.id);
dependenciesProvideWasCalledWith = dependenciesProvideWasCalledWith.concat(dependencies);
if (dependencies.indexOf("asdf") !== -1) {
if (!require.isMemoized("asdf")) {
require.memoize("asdf", [], function () { });
}
dependencies = dependencies.splice(dependencies.indexOf("asdf"), 1);
}
originalModuleProvide.call(this, dependencies, onAllProvided);
};
module.declare(["demos/circular/circularAndNonextantA"], function () {
ok(idsOfModulesProvideIsCalledOn.indexOf("demos/circular/circularAndNonextantA") !== -1, "The overriden version of module.provide was called with this.id set to that of the module the main module depends on");
ok(dependenciesProvideWasCalledWith.indexOf("demos/circular/circularAndNonextantB") !== -1, "The overriden version of module.provide was called to provide the other module in the circular dependency chain");
ok(dependenciesProvideWasCalledWith.indexOf("asdf") !== -1, "The overriden version of module.provide was called to provide the module the un-memoized module outside the circular dependency chain");
module.constructor.prototype.provide = originalModuleProvide;
start();
});
});
asyncTest("Overriden provide: can provide a dependency to a dependency of a memoized module", function () {
var idsOfModulesProvideIsCalledOn = [];
var dependenciesProvideWasCalledWith = [];
var originalModuleProvide = module.constructor.prototype.provide;
module.constructor.prototype.provide = function (dependencies, onAllProvided) {
idsOfModulesProvideIsCalledOn.push(this.id);
dependenciesProvideWasCalledWith = dependenciesProvideWasCalledWith.concat(dependencies);
var desiredOperationsCompleted = 1;
var operationsCompleted = 0;
function completeOperation() {
if (++operationsCompleted === desiredOperationsCompleted) {
onAllProvided();
}
}
if (dependencies.indexOf("providedByPlugin") !== -1) {
if (!require.isMemoized("providedByPlugin")) {
++desiredOperationsCompleted;
setTimeout(function () {
require.memoize("providedByPlugin", [], function () { });
completeOperation();
}, 0);
}
dependencies = dependencies.splice(dependencies.indexOf("asdf"), 1);
}
originalModuleProvide.call(this, dependencies, completeOperation);
};
require.memoize("memoized", ["providedByPlugin", "demos/math"], function () { });
module.declare(["memoized"], function () {
ok(idsOfModulesProvideIsCalledOn.indexOf("memoized") !== -1, "The overriden version of module.provide was called with this.id set to that of the memoized dependency");
ok(dependenciesProvideWasCalledWith.indexOf("providedByPlugin") !== -1, "The overriden version of module.provide was called to provide the module that was only available via plug-in provision");
module.constructor.prototype.provide = originalModuleProvide;
start();
});
});
test("Overriden declare: is called when declaring the main module", function () {
var dependenciesDeclareWasCalledWith = null;
var factoryFunctionDeclareWasCalledWith = null;
var originalModuleDeclare = module.constructor.prototype.declare;
module.constructor.prototype.declare = function (dependencies, moduleFactory) {
dependenciesDeclareWasCalledWith = dependencies;
factoryFunctionDeclareWasCalledWith = moduleFactory;
};
var dependencies = ["dependency/1", "dependency/2"];
var moduleFactory = function () { };
module.declare(dependencies, moduleFactory);
deepEqual(dependenciesDeclareWasCalledWith, dependencies, "The correct dependencies array was passed to the overriden module.declare");
strictEqual(factoryFunctionDeclareWasCalledWith, moduleFactory, "The correct factory function was passed to the overriden module.declare");
module.constructor.prototype.declare = originalModuleDeclare;
});
asyncModuleTest("Overriden declare: is called when using module.load", function (require, exports, module) {
var mathExports = {};
var originalModuleDeclare = module.constructor.prototype.declare;
module.constructor.prototype.declare = function (moduleFactory) {
// We know that demos/math does not return alternate exports and does not pass the optional dependency array,
// so we implement a stub based on that knowledge instead of a more general one.
moduleFactory(null, mathExports, null);
};
module.load("demos/math", function () {
strictEqual(typeof mathExports.add, "function", "Executing the factory function that was passed to the overriden module.declare returns an object with the expected exports");
module.constructor.prototype.declare = originalModuleDeclare;
start();
});
});
define(['apps/system3/production/production.controller',
'apps/system3/production/specialty/specialty.service',
'apps/system3/production/provide/provide.service'], function (app) {
app.controller('production.controller.provide.maintain', function ($scope, maintainParams, $uibModalInstance) {
$scope.windowProvide = maintainParams.provideInfo;
if (maintainParams.task) {
$scope.taskID = maintainParams.task.ID;
}
$scope.receiveUsers = [];
$scope.volumeFiles = [];
$scope.currentVolume = {};
// æ°å»ºæèµ
$scope.newProvide = function (provide) {
$scope.readOnly = false;
$scope.provideInfo = {
Engineering: provide.Engineering,
EngineeringID: provide.Engineering.ID,
SendSpecialtyID: provide.Specialty.SpecialtyID,
ReceiveUserIDs: "",
DocName: "",
DocContent: "",
AttachIDs: [],
VolumeFiles: []
};
$scope.flowData = {
EngineeringID: provide.Engineering.ID,
SpecialtyID: provide.Specialty.SpecialtyID
};
// æ°å¢å è½½ä¸ä¸çå·åæä»¶
$scope.loadVolumeFiles();
}
// ç¼è¾æèµ
$scope.maintainProvide = function (provide, task) {
$scope.readOnly = !$scope.taskID;
$scope.provideInfo = provide;
if (!$scope.readOnly) {
if (provide.ReceiveUserIDs.length > 0) {
var str = ',' + provide.ReceiveUserIDs + ',';
angular.forEach($rootScope.user_item, function (user) {
if (str.indexOf(',' + user.ID + ',') >= 0) {
$scope.receiveUsers.push({
ID: user.ID,
Name: user.Name,
Dept: user.Dept,
PhotoImg: user.PhotoImg
});
}
});
}
// æ°å¢å è½½ä¸ä¸çå·åæä»¶
$scope.loadVolumeFiles();
}
}
// è·åå·åæä»¶
$scope.loadVolumeFiles = function () {
console.log(111)
//$scope.providePanel.block();
specialtyService.getFiles($scope.provideInfo.EngineeringID, $scope.provideInfo.SendSpecialtyID).then(function (data) {
$scope.volumeFiles = data;
$scope.currentVolume = data[0];
//$scope.providePanel.unblock();
});
}
// éæ©å·å
$scope.volChanged = function (v) {
$scope.currentVolume = v;
}
// å
¨éå·åæä»¶
$scope.selectAll = function (vol) {
angular.forEach(vol.Files, function (f) {
f.selected = vol.selected;
});
}
// è·åéä¸å·åæä»¶çæ°é
$scope.getSelectedFileCount = function (files) {
var count = 0;
angular.forEach(files, function (f) {
if (f.selected) {
count++;
}
});
return count;
}
// ä¿å
$scope.save = function (flow) {
$scope.providePanel.block();
if ($scope.provideInfo.ID > 0) {
// ç¼è¾
provideService.update($scope.provideInfo).then(function () {
flow.callBack(function () {
$scope.providePanel.unblock();
if ($scope.afterSave) {
$scope.afterSave();
} else {
$scope.loadSource();
}
});
});
} else {
// æ°å¢
$scope.provideInfo.ApproveUser = flow.taskInfo.user;
provideService.create($scope.provideInfo).then(function () {
// éç¥éä»¶é¢è§æ§ä»¶æ´æ°éä»¶å表
if ($scope.attachChangedCB) {
$scope.attachChangedCB();
}
flow.callBack(function () {
$scope.providePanel.unblock();
if ($scope.afterSave) {
$scope.afterSave();
} else {
$scope.loadSource();
}
});
});
}
return true;
}
$scope.$watchCollection("receiveUsers", function (newval, oldval) {
if (newval && $scope.provideInfo) {
if (newval.length == 0) {
$scope.provideInfo.ReceiveUserIDs = undefined;
} else {
var ids = [];
angular.forEach(newval, function (user) {
ids.push(user.ID);
})
$scope.provideInfo.ReceiveUserIDs = ids.join(',');
}
}
});
$scope.$watch("volumeFiles", function (newval, oldval) {
if (newval && $scope.provideInfo) {
$scope.provideInfo.VolumeFiles = [];
angular.forEach(newval, function (vol) {
angular.forEach(vol.Files, function (f) {
if (f.selected) {
$scope.provideInfo.VolumeFiles.push(f.ID);
}
});
});
}
}, true);
$scope.$watch("currentProvide", function (newval, oldval) {
if (newval) {
if (newval.ID > 0) {
$scope.maintainProvide(newval);
} else {
$scope.newProvide(newval);
}
}
});
$scope.$on("newProvide", function (e, data) {
$scope.newProvide(data);
})
// éä»¶ä¸ä¼ 宿ååè°
$scope.attachUploaded = function (id, attachChangedCB) {
// æ°å»ºç模å¼ä¸ï¼å
ä¿åä¸ä¼ çéä»¶IDï¼å½ä¿¡æ¯è¢«ä¿ååï¼å¨ä¿å该éä»¶ID
$scope.provideInfo.AttachIDs.push(id);
$scope.attachChangedCB = attachChangedCB;
};
// åæ´ä¿¡æ¯
if ($scope.windowProvide) {
if ($scope.windowProvide.ID > 0) {
$scope.maintainProvide($scope.windowProvide)
} else {
$scope.newProvide($scope.windowProvide)
}
}
// å
³éç¼è¾æ¨¡å¼
$scope.closeModal = function () {
$uibModalInstance.dismiss('cancel');
}
});
});
import Vue from 'vue'
import { Observer } from 'core/observer/index'
import { isNative, isObject, hasOwn } from 'core/util/index'
import testObjectOption from '../../../helpers/test-object-option'
describe('Options provide/inject', () => {
testObjectOption('inject')
let injected
const injectedComp = {
inject: ['foo', 'bar'],
render () {},
created () {
injected = [this.foo, this.bar]
}
}
beforeEach(() => {
injected = null
})
it('should work', () => {
new Vue({
template: `<child/>`,
provide: {
foo: 1,
bar: false
},
components: {
child: {
template: `<injected-comp/>`,
components: {
injectedComp
}
}
}
}).$mount()
expect(injected).toEqual([1, false])
})
it('should use closest parent', () => {
new Vue({
template: `<child/>`,
provide: {
foo: 1,
bar: null
},
components: {
child: {
provide: {
foo: 3
},
template: `<injected-comp/>`,
components: {
injectedComp
}
}
}
}).$mount()
expect(injected).toEqual([3, null])
})
it('provide function', () => {
new Vue({
template: `<child/>`,
data: {
a: 1,
b: false
},
provide () {
return {
foo: this.a,
bar: this.b
}
},
components: {
child: {
template: `<injected-comp/>`,
components: {
injectedComp
}
}
}
}).$mount()
expect(injected).toEqual([1, false])
})
it('inject with alias', () => {
const injectAlias = {
inject: {
baz: 'foo',
qux: 'bar'
},
render () {},
created () {
injected = [this.baz, this.qux]
}
}
new Vue({
template: `<child/>`,
provide: {
foo: false,
bar: 2
},
components: {
child: {
template: `<inject-alias/>`,
components: {
injectAlias
}
}
}
}).$mount()
expect(injected).toEqual([false, 2])
})
it('inject before resolving data/props', () => {
const vm = new Vue({
provide: {
foo: 1
}
})
const child = new Vue({
parent: vm,
inject: ['foo'],
data () {
return {
bar: this.foo + 1
}
},
props: {
baz: {
default () {
return this.foo + 2
}
}
}
})
expect(child.foo).toBe(1)
expect(child.bar).toBe(2)
expect(child.baz).toBe(3)
})
// GitHub issue #5194
it('should work with functional', () => {
new Vue({
template: `<child/>`,
provide: {
foo: 1,
bar: false
},
components: {
child: {
functional: true,
inject: ['foo', 'bar'],
render (h, context) {
const { injections } = context
injected = [injections.foo, injections.bar]
}
}
}
}).$mount()
expect(injected).toEqual([1, false])
})
if (typeof Reflect !== 'undefined' && isNative(Reflect.ownKeys)) {
it('with Symbol keys', () => {
const s = Symbol()
const vm = new Vue({
template: `<child/>`,
provide: {
[s]: 123
},
components: {
child: {
inject: { s },
template: `<div>{{ s }}</div>`
}
}
}).$mount()
expect(vm.$el.textContent).toBe('123')
})
it('should merge symbol provide from mixins (functions)', () => {
const keyA = Symbol('foo')
const keyB = Symbol('bar')
const mixinA = { provide: () => ({ [keyA]: 'foo' }) }
const mixinB = { provide: () => ({ [keyB]: 'bar' }) }
const child = {
inject: {
foo: keyA,
bar: keyB
},
template: `<span/>`,
created () {
injected = [this.foo, this.bar]
}
}
new Vue({
mixins: [mixinA, mixinB],
render (h) {
return h(child)
}
}).$mount()
expect(injected).toEqual(['foo', 'bar'])
})
}
// GitHub issue #5223
it('should work with reactive array', done => {
const vm = new Vue({
template: `<div><child></child></div>`,
data () {
return {
foo: []
}
},
provide () {
return {
foo: this.foo
}
},
components: {
child: {
inject: ['foo'],
template: `<span>{{foo.length}}</span>`
}
}
}).$mount()
expect(vm.$el.innerHTML).toEqual(`<span>0</span>`)
vm.foo.push(vm.foo.length)
vm.$nextTick(() => {
expect(vm.$el.innerHTML).toEqual(`<span>1</span>`)
vm.foo.pop()
vm.$nextTick(() => {
expect(vm.$el.innerHTML).toEqual(`<span>0</span>`)
done()
})
})
})
it('should extend properly', () => {
const parent = Vue.extend({
template: `<span/>`,
inject: ['foo']
})
const child = parent.extend({
template: `<span/>`,
inject: ['bar'],
created () {
injected = [this.foo, this.bar]
}
})
new Vue({
template: `<div><parent/><child/></div>`,
provide: {
foo: 1,
bar: false
},
components: {
parent,
child
}
}).$mount()
expect(injected).toEqual([1, false])
})
it('should merge from mixins properly (objects)', () => {
const mixinA = { inject: { foo: 'foo' }}
const mixinB = { inject: { bar: 'bar' }}
const child = {
mixins: [mixinA, mixinB],
template: `<span/>`,
created () {
injected = [this.foo, this.bar]
}
}
new Vue({
provide: { foo: 'foo', bar: 'bar', baz: 'baz' },
render (h) {
return h(child)
}
}).$mount()
expect(injected).toEqual(['foo', 'bar'])
})
it('should merge from mixins properly (arrays)', () => {
const mixinA = { inject: ['foo'] }
const mixinB = { inject: ['bar'] }
const child = {
mixins: [mixinA, mixinB],
inject: ['baz'],
template: `<span/>`,
created () {
injected = [this.foo, this.bar, this.baz]
}
}
new Vue({
provide: { foo: 'foo', bar: 'bar', baz: 'baz' },
render (h) {
return h(child)
}
}).$mount()
expect(injected).toEqual(['foo', 'bar', 'baz'])
})
it('should merge from mixins properly (mix of objects and arrays)', () => {
const mixinA = { inject: { foo: 'foo' }}
const mixinB = { inject: ['bar'] }
const child = {
mixins: [mixinA, mixinB],
inject: { qux: 'baz' },
template: `<span/>`,
created () {
injected = [this.foo, this.bar, this.qux]
}
}
new Vue({
provide: { foo: 'foo', bar: 'bar', baz: 'baz' },
render (h) {
return h(child)
}
}).$mount()
expect(injected).toEqual(['foo', 'bar', 'baz'])
})
it('should warn when injections has been modified', () => {
const key = 'foo'
const vm = new Vue({
provide: {
foo: 1
}
})
const child = new Vue({
parent: vm,
inject: ['foo']
})
expect(child.foo).toBe(1)
child.foo = 2
expect(
`Avoid mutating an injected value directly since the changes will be ` +
`overwritten whenever the provided component re-renders. ` +
`injection being mutated: "${key}"`).toHaveBeenWarned()
})
it('should warn when injections cannot be found', () => {
const vm = new Vue({})
new Vue({
parent: vm,
inject: ['foo', 'bar'],
created () {}
})
expect(`Injection "foo" not found`).toHaveBeenWarned()
expect(`Injection "bar" not found`).toHaveBeenWarned()
})
it('should not warn when injections can be found', () => {
const vm = new Vue({
provide: {
foo: 1,
bar: false,
baz: undefined
}
})
new Vue({
parent: vm,
inject: ['foo', 'bar', 'baz'],
created () {}
})
expect(`Injection "foo" not found`).not.toHaveBeenWarned()
expect(`Injection "bar" not found`).not.toHaveBeenWarned()
expect(`Injection "baz" not found`).not.toHaveBeenWarned()
})
it('should not warn when injection key which is not provided is not enumerable', () => {
const parent = new Vue({ provide: { foo: 1 }})
const inject = { foo: 'foo' }
Object.defineProperty(inject, '__ob__', { enumerable: false, value: '__ob__' })
new Vue({ parent, inject })
expect(`Injection "__ob__" not found`).not.toHaveBeenWarned()
})
// Github issue #6097
it('should not warn when injections cannot be found but have default value', () => {
const vm = new Vue({})
new Vue({
parent: vm,
inject: {
foo: { default: 1 },
bar: { default: false },
baz: { default: undefined }
},
created () {
injected = [this.foo, this.bar, this.baz]
}
})
expect(injected).toEqual([1, false, undefined])
})
it('should support name alias and default together', () => {
const vm = new Vue({
provide: {
FOO: 2
}
})
new Vue({
parent: vm,
inject: {
foo: { from: 'FOO', default: 1 },
bar: { default: false },
baz: { default: undefined }
},
created () {
injected = [this.foo, this.bar, this.baz]
}
})
expect(injected).toEqual([2, false, undefined])
})
it('should use provided value even if inject has default', () => {
const vm = new Vue({
provide: {
foo: 1,
bar: false,
baz: undefined
}
})
new Vue({
parent: vm,
inject: {
foo: { default: 2 },
bar: { default: 2 },
baz: { default: 2 }
},
created () {
injected = [this.foo, this.bar, this.baz]
}
})
expect(injected).toEqual([1, false, undefined])
})
// Github issue #6008
it('should merge provide from mixins (objects)', () => {
const mixinA = { provide: { foo: 'foo' }}
const mixinB = { provide: { bar: 'bar' }}
const child = {
inject: ['foo', 'bar'],
template: `<span/>`,
created () {
injected = [this.foo, this.bar]
}
}
new Vue({
mixins: [mixinA, mixinB],
render (h) {
return h(child)
}
}).$mount()
expect(injected).toEqual(['foo', 'bar'])
})
it('should merge provide from mixins (functions)', () => {
const mixinA = { provide: () => ({ foo: 'foo' }) }
const mixinB = { provide: () => ({ bar: 'bar' }) }
const child = {
inject: ['foo', 'bar'],
template: `<span/>`,
created () {
injected = [this.foo, this.bar]
}
}
new Vue({
mixins: [mixinA, mixinB],
render (h) {
return h(child)
}
}).$mount()
expect(injected).toEqual(['foo', 'bar'])
})
it('should merge provide from mixins (mix of objects and functions)', () => {
const mixinA = { provide: { foo: 'foo' }}
const mixinB = { provide: () => ({ bar: 'bar' }) }
const mixinC = { provide: { baz: 'baz' }}
const mixinD = { provide: () => ({ bam: 'bam' }) }
const child = {
inject: ['foo', 'bar', 'baz', 'bam'],
template: `<span/>`,
created () {
injected = [this.foo, this.bar, this.baz, this.bam]
}
}
new Vue({
mixins: [mixinA, mixinB, mixinC, mixinD],
render (h) {
return h(child)
}
}).$mount()
expect(injected).toEqual(['foo', 'bar', 'baz', 'bam'])
})
it('should merge provide from mixins and override existing keys', () => {
const mixinA = { provide: { foo: 'foo' }}
const mixinB = { provide: { foo: 'bar' }}
const child = {
inject: ['foo'],
template: `<span/>`,
created () {
injected = [this.foo]
}
}
new Vue({
mixins: [mixinA, mixinB],
render (h) {
return h(child)
}
}).$mount()
expect(injected).toEqual(['bar'])
})
it('should merge provide when Vue.extend', () => {
const mixinA = { provide: () => ({ foo: 'foo' }) }
const child = {
inject: ['foo', 'bar'],
template: `<span/>`,
created () {
injected = [this.foo, this.bar]
}
}
const Ctor = Vue.extend({
mixins: [mixinA],
provide: { bar: 'bar' },
render (h) {
return h(child)
}
})
new Ctor().$mount()
expect(injected).toEqual(['foo', 'bar'])
})
// #5913
it('should keep the reactive with provide', () => {
function isObserver (obj) {
if (isObject(obj)) {
return hasOwn(obj, '__ob__') && obj.__ob__ instanceof Observer
}
return false
}
const vm = new Vue({
template: `<div><child ref='child'></child></div>`,
data () {
return {
foo: {},
$foo: {},
foo1: []
}
},
provide () {
return {
foo: this.foo,
$foo: this.$foo,
foo1: this.foo1,
bar: {},
baz: []
}
},
components: {
child: {
inject: ['foo', '$foo', 'foo1', 'bar', 'baz'],
template: `<span/>`
}
}
}).$mount()
const child = vm.$refs.child
expect(isObserver(child.foo)).toBe(true)
expect(isObserver(child.$foo)).toBe(false)
expect(isObserver(child.foo1)).toBe(true)
expect(isObserver(child.bar)).toBe(false)
expect(isObserver(child.baz)).toBe(false)
})
// #6175
it('merge provide properly from mixins', () => {
const ProvideFooMixin = {
provide: {
foo: 'foo injected'
}
}
const ProvideBarMixin = {
provide: {
bar: 'bar injected'
}
}
const Child = {
inject: ['foo', 'bar'],
render (h) {
return h('div', [`foo: ${this.foo}, `, `bar: ${this.bar}`])
}
}
const Parent = {
mixins: [ProvideFooMixin, ProvideBarMixin],
render (h) {
return h(Child)
}
}
const vm = new Vue({
render (h) {
return h(Parent)
}
}).$mount()
expect(vm.$el.textContent).toBe(`foo: foo injected, bar: bar injected`)
})
it('merge provide with object syntax when using Vue.extend', () => {
const child = {
inject: ['foo'],
template: `<span/>`,
created () {
injected = this.foo
}
}
const Ctor = Vue.extend({
provide: { foo: 'foo' },
render (h) {
return h(child)
}
})
new Ctor().$mount()
expect(injected).toEqual('foo')
})
// #7284
it('should not inject prototype properties', () => {
const vm = new Vue({
provide: {}
})
new Vue({
parent: vm,
inject: ['constructor']
})
expect(`Injection "constructor" not found`).toHaveBeenWarned()
})
})