将部分字符串绑定到 Angular 范围变量
Bind part of string to Angular scope variable
我正在从服务器中提取 JSON 数据。在我返回的 JSON 对象中,我有一些字符串,我希望能够使用占位符动态插入用户在 UI.
中输入的值
我的理解是这就是 $compile 的用途,但我似乎无法让它发挥作用。我不确定这是否可行,或者我只是以错误的方式接近它。
编辑:不确定我是否解释得很好。更进一步,我更新了 Plunk 和下面的代码
一个简化的例子(view Plunk):
查看:
<body ng-controller="MainCtrl">
<input ng-model="name" type="text" />
<p ng-bind-html="myval">{{myval}}</p>
<p>{{name}}</p>
</body>
Angular 应用程序:
var app = angular.module('plunker', ['ngSanitize']);
app.controller('MainCtrl', function($scope, $compile, dataSvc) {
init();
function init() {
$scope.data = dataSvc.getData();
$scope.name = '';
}
$scope.$watch('name', function(newVal, oldVal) {
var c = $compile('<span>' + $scope.data.vals[0].text + '</span>')($scope);
console.log(c);
console.log(c[0]);
$scope.myval = c[0];
});
});
app.service('dataSvc', function () {
this.getData = function () {
return {
vals: [
{
text: "Hello {{name}}"
}
]
}
};
});
这几乎可以与 $compile 一起使用,并且控制台会按照我希望的方式记录更改,我只是无法在显示器上输出它。
除非您使用的是 ECMA6,否则括号 ({{}}) 保留用于在 HTML 中插入字符串,而不是 javascript。
要在 javascript 中实现您想要的,只需将变量添加到字符串中:
var app = angular.module('plunker', []);
app.controller('MainCtrl', function($scope) {
$scope.name = 'World';
$scope.test = "Hello " + $scope.name + "!";
init();
function init() {
$scope.concat = $scope.test;
}
});
如果您希望 JSON 异步更新名称或在编译后的任何时间更新名称,那么在视图中使用范围变量正是您应该做的:
<body ng-controller="MainCtrl">
<p>Hello {{name}}!</p>
</body>
然后在你的控制器中:
var app = angular.module('plunker', []);
app.controller('MainCtrl', function($scope) {
$scope.name = 'World';
function updateName(name) { // call this when the data is ready
$scope.name = name;
}
});
你为什么不写这样的东西:
$scope.greetingText = "Hello";
$scope.greetingName = "World";
然后是
$scope.completeGreeting = $scope.greetingText + $scope.greetingName + "!";
现在看到这样的东西:
{{greetingText}} {{greetingName}}!
{{completeGreeting}}
我编辑了你的Plnkr,输入框结合了ngModel。它将输出您在输入模型中输入的任何字符串。据我了解,您想输出用户在 UI 中输入的字符串,因此这可能对您有用。
<body ng-controller="MainCtrl">
Name: <input ng-model="userInput" placeholder="Enter your input..."/><br>
<p>{{userInput || "User input will come here..."}}</p>
</body>
我建议您在将变量分配给其他变量时使用 $interpolate
服务,这将负责花括号的计算。
代码
var app = angular.module('plunker', []);
app.controller('MainCtrl', function($scope, $interpolate) {
$scope.test = "Hello {{name}}!";
$scope.name = 'World';
init();
function init() {
$scope.concat = $interpolate($scope.test)($scope);
}
});
我正在从服务器中提取 JSON 数据。在我返回的 JSON 对象中,我有一些字符串,我希望能够使用占位符动态插入用户在 UI.
中输入的值我的理解是这就是 $compile 的用途,但我似乎无法让它发挥作用。我不确定这是否可行,或者我只是以错误的方式接近它。
编辑:不确定我是否解释得很好。更进一步,我更新了 Plunk 和下面的代码
一个简化的例子(view Plunk):
查看:
<body ng-controller="MainCtrl">
<input ng-model="name" type="text" />
<p ng-bind-html="myval">{{myval}}</p>
<p>{{name}}</p>
</body>
Angular 应用程序:
var app = angular.module('plunker', ['ngSanitize']);
app.controller('MainCtrl', function($scope, $compile, dataSvc) {
init();
function init() {
$scope.data = dataSvc.getData();
$scope.name = '';
}
$scope.$watch('name', function(newVal, oldVal) {
var c = $compile('<span>' + $scope.data.vals[0].text + '</span>')($scope);
console.log(c);
console.log(c[0]);
$scope.myval = c[0];
});
});
app.service('dataSvc', function () {
this.getData = function () {
return {
vals: [
{
text: "Hello {{name}}"
}
]
}
};
});
这几乎可以与 $compile 一起使用,并且控制台会按照我希望的方式记录更改,我只是无法在显示器上输出它。
除非您使用的是 ECMA6,否则括号 ({{}}) 保留用于在 HTML 中插入字符串,而不是 javascript。
要在 javascript 中实现您想要的,只需将变量添加到字符串中:
var app = angular.module('plunker', []);
app.controller('MainCtrl', function($scope) {
$scope.name = 'World';
$scope.test = "Hello " + $scope.name + "!";
init();
function init() {
$scope.concat = $scope.test;
}
});
如果您希望 JSON 异步更新名称或在编译后的任何时间更新名称,那么在视图中使用范围变量正是您应该做的:
<body ng-controller="MainCtrl">
<p>Hello {{name}}!</p>
</body>
然后在你的控制器中:
var app = angular.module('plunker', []);
app.controller('MainCtrl', function($scope) {
$scope.name = 'World';
function updateName(name) { // call this when the data is ready
$scope.name = name;
}
});
你为什么不写这样的东西:
$scope.greetingText = "Hello";
$scope.greetingName = "World";
然后是
$scope.completeGreeting = $scope.greetingText + $scope.greetingName + "!";
现在看到这样的东西:
{{greetingText}} {{greetingName}}!
{{completeGreeting}}
我编辑了你的Plnkr,输入框结合了ngModel。它将输出您在输入模型中输入的任何字符串。据我了解,您想输出用户在 UI 中输入的字符串,因此这可能对您有用。
<body ng-controller="MainCtrl">
Name: <input ng-model="userInput" placeholder="Enter your input..."/><br>
<p>{{userInput || "User input will come here..."}}</p>
</body>
我建议您在将变量分配给其他变量时使用 $interpolate
服务,这将负责花括号的计算。
代码
var app = angular.module('plunker', []);
app.controller('MainCtrl', function($scope, $interpolate) {
$scope.test = "Hello {{name}}!";
$scope.name = 'World';
init();
function init() {
$scope.concat = $interpolate($scope.test)($scope);
}
});