AngularJS 将 属性 绑定到组件中的对象
AngularJS binding property to object in component
我有一个带有以下控制器的应用程序:
var app = angular.module('someApp', []);
app.controller('mainCtrl', function($scope, $timeout) {
$timeout(function() {
$scope.myObject = {
type: 'blaat'
}
}, 5000);
});
它有一个超时,5 秒后在 mainCtrl 上创建一个类型为 属性 的对象。我还定义了一个采用 属性 类型的组件:
app.component('createSome', {
templateUrl: 'create.html',
controller: 'createController as create',
bindings: {
type: '='
}
});
当该对象上的类型可用并将该类型传递给该组件时呈现该组件:
<body ng-controller="mainCtrl">
mainCtrl object: {{ myObject.type }}
<create-some
ng-if="myObject.type"
type="myObject.type">
</create-some>
</body>
该组件的控制器正在创建一个初始化时具有该类型的新对象。这就是问题所在;该对象永远不会获得 属性 类型。当初始化 createController 时,我还添加了一个额外的 console.log 并且在那里也看不到类型 属性 。不过,该类型正在控制器上的组件内正确打印。
app.controller('createController', function($scope) {
var vm = this;
console.log('creating create controller', vm.type);
vm.newObject = {
type: vm.type
};
});
我想这是某种时间问题;在控制器范围内设置组件的 属性 之前,正在初始化控制器。我的问题是:我必须更改什么才能使组件控制器中的对象按需要工作。我唯一能想到但宁愿避免的是使用手表。
我还创建了以下包含上述所有内容的 plunk:
https://plnkr.co/edit/XIfm1y6GBT2WcFKBvlPY
我问这个是因为我正在处理的应用程序中有类似的情况。奇怪的是,这似乎在所有环境的生产中都能正常工作。当 运行 本地代码(使用 gulp 和 browserify)时,它在 windows 计算机上失败,但在我的 macbook 上没有。哪种让我大吃一惊。它之前在 windows 台计算机上工作,并且在这期间没有对该部分的代码进行更改。如果有人对此有解释会更好,但我已经很高兴用正确的方法来处理它。 :-)
除了 plunk 在我测试它的任何机器上表现相同,所以无论如何它可能是特定于项目其余部分的东西。
通过查看 component documentation components bindings (vm.type
in your case) are available after $onInit
was called by the component - You are fine but you are a bit to early =). Please check this running plnkr。我不知道为什么它在某些环境下对你有用,但通过阅读文档它应该不起作用。也许你很幸运,因为你的其他硬件要快得多,并且 vm.type
在组件实例化的那一刻就被解析了。
var app = angular.module('someApp', []);
app.controller('mainCtrl', function($scope, $timeout) {
$timeout(function() {
$scope.myObject = {
type: 'blaat'
}
}, 5000);
});
app.controller('createController', function($scope) {
var vm = this;
vm.newObject = {
type: vm.type
};
this.$onInit = function () {
console.log('creating create controller', vm.type);
};
});
app.component('createSome', {
templateUrl: 'create.html',
controller: 'createController as create',
bindings: {
type: '='
}
})
我有一个带有以下控制器的应用程序:
var app = angular.module('someApp', []);
app.controller('mainCtrl', function($scope, $timeout) {
$timeout(function() {
$scope.myObject = {
type: 'blaat'
}
}, 5000);
});
它有一个超时,5 秒后在 mainCtrl 上创建一个类型为 属性 的对象。我还定义了一个采用 属性 类型的组件:
app.component('createSome', {
templateUrl: 'create.html',
controller: 'createController as create',
bindings: {
type: '='
}
});
当该对象上的类型可用并将该类型传递给该组件时呈现该组件:
<body ng-controller="mainCtrl">
mainCtrl object: {{ myObject.type }}
<create-some
ng-if="myObject.type"
type="myObject.type">
</create-some>
</body>
该组件的控制器正在创建一个初始化时具有该类型的新对象。这就是问题所在;该对象永远不会获得 属性 类型。当初始化 createController 时,我还添加了一个额外的 console.log 并且在那里也看不到类型 属性 。不过,该类型正在控制器上的组件内正确打印。
app.controller('createController', function($scope) {
var vm = this;
console.log('creating create controller', vm.type);
vm.newObject = {
type: vm.type
};
});
我想这是某种时间问题;在控制器范围内设置组件的 属性 之前,正在初始化控制器。我的问题是:我必须更改什么才能使组件控制器中的对象按需要工作。我唯一能想到但宁愿避免的是使用手表。
我还创建了以下包含上述所有内容的 plunk:
https://plnkr.co/edit/XIfm1y6GBT2WcFKBvlPY
我问这个是因为我正在处理的应用程序中有类似的情况。奇怪的是,这似乎在所有环境的生产中都能正常工作。当 运行 本地代码(使用 gulp 和 browserify)时,它在 windows 计算机上失败,但在我的 macbook 上没有。哪种让我大吃一惊。它之前在 windows 台计算机上工作,并且在这期间没有对该部分的代码进行更改。如果有人对此有解释会更好,但我已经很高兴用正确的方法来处理它。 :-) 除了 plunk 在我测试它的任何机器上表现相同,所以无论如何它可能是特定于项目其余部分的东西。
通过查看 component documentation components bindings (vm.type
in your case) are available after $onInit
was called by the component - You are fine but you are a bit to early =). Please check this running plnkr。我不知道为什么它在某些环境下对你有用,但通过阅读文档它应该不起作用。也许你很幸运,因为你的其他硬件要快得多,并且 vm.type
在组件实例化的那一刻就被解析了。
var app = angular.module('someApp', []);
app.controller('mainCtrl', function($scope, $timeout) {
$timeout(function() {
$scope.myObject = {
type: 'blaat'
}
}, 5000);
});
app.controller('createController', function($scope) {
var vm = this;
vm.newObject = {
type: vm.type
};
this.$onInit = function () {
console.log('creating create controller', vm.type);
};
});
app.component('createSome', {
templateUrl: 'create.html',
controller: 'createController as create',
bindings: {
type: '='
}
})