淘汰高级声明javascript“;加上-喜欢

淘汰高级声明javascript“;加上-喜欢,javascript,knockout.js,Javascript,Knockout.js,我陷入了需要在子元素中的任何地方都可以访问自定义变量的领域,比如我们可以引用的$parents、$parent。 例如: 这两个选项都没有为您提供JavaScript的和(但是,JavaScript的和有一些相当大的维护问题),但这里有几个选项供您选择: 您最好的选择可能是(比如)对容器甚至根VM进行计算 yourVm.hello = ko.computed({ pure: true, // If it is, that is read: function() {

我陷入了需要在子元素中的任何地方都可以访问自定义变量的领域,比如我们可以引用的$parents、$parent。 例如:


这两个选项都没有为您提供JavaScript的
(但是,JavaScript的
有一些相当大的维护问题),但这里有几个选项供您选择:


您最好的选择可能是(比如)对容器甚至根VM进行计算

yourVm.hello = ko.computed({
    pure: true, // If it is, that is
    read: function() {
        // complex stuff here
    }
});
例如:

(函数(){
“严格使用”;
var vm={
foo:ko.可观察(“foo”),
条形图:可观察到的(以下简称“条形图”),
名单:ko.Array([
“一”,“二”,“三”
])
};
vm.hello=ko.computed({
纯:真的,
业主:这个,
读:函数(){
返回this.foo()+this.bar();
}
});
应用绑定(vm,document.body);
})();

这两个选项都没有为您提供JavaScript的
(但是,JavaScript的
有一些相当大的维护问题),但这里有几个选项供您选择:


您最好的选择可能是(比如)对容器甚至根VM进行计算

yourVm.hello = ko.computed({
    pure: true, // If it is, that is
    read: function() {
        // complex stuff here
    }
});
例如:

(函数(){
“严格使用”;
var vm={
foo:ko.可观察(“foo”),
条形图:可观察到的(以下简称“条形图”),
名单:ko.Array([
“一”,“二”,“三”
])
};
vm.hello=ko.computed({
纯:真的,
业主:这个,
读:函数(){
返回this.foo()+this.bar();
}
});
应用绑定(vm,document.body);
})();

不久前,我为自己创建了一个名为
let
的简单绑定,它可以满足您的需要。这是:

ko.bindingHandlers['let'] = {
    init: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
        // Make a modified binding context, with extra properties, and apply it to descendant elements
        var innerContext = bindingContext.extend(valueAccessor);
        ko.applyBindingsToDescendants(innerContext, element);
        return { controlsDescendantBindings: true };
    }
};
ko.virtualElements.allowedBindings['let'] = true;
您可以这样使用它:

<div data-bind:"let: { $hello: somethingTimeConsuming() }">
     <div data-bind="foreach: something">
         <span data-bind="text: $hello.stringReference">                 
         </span>
     </div>
</div>

不久前,我为自己创建了一个名为
let
的简单绑定,它可以满足您的需要。这是:

ko.bindingHandlers['let'] = {
    init: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
        // Make a modified binding context, with extra properties, and apply it to descendant elements
        var innerContext = bindingContext.extend(valueAccessor);
        ko.applyBindingsToDescendants(innerContext, element);
        return { controlsDescendantBindings: true };
    }
};
ko.virtualElements.allowedBindings['let'] = true;
您可以这样使用它:

<div data-bind:"let: { $hello: somethingTimeConsuming() }">
     <div data-bind="foreach: something">
         <span data-bind="text: $hello.stringReference">                 
         </span>
     </div>
</div>

Knockouts
foreach
binding有一个
as
选项,可以满足您的需要。如果您有一个“something”数组,并且希望能够将它们引用为
$something.which
,那么

<!-- ko foreach: {data: arrayOfSomethings, as: '$something'} -->
    <span data-bind="text: $something.foo"></span> <!-- works in any child context -->
<!-- /ko -->

(旁注,我并不建议使用“$something”作为您的名字;我会将$prefixes保留为敲除定义的内容,并将您的内容称为“something”;我个人认为)

敲除
foreach
绑定有一个
as
选项,可以满足您的需要。如果您有一个“something”数组,并且希望能够将它们引用为
$something.which
,那么

<!-- ko foreach: {data: arrayOfSomethings, as: '$something'} -->
    <span data-bind="text: $something.foo"></span> <!-- works in any child context -->
<!-- /ko -->

(旁注,我并不建议使用“$something”作为您的名字;我会将$prefixes作为敲除定义的东西,并将您的东西称为“something”;我个人认为)

同意,这里的主要收获是在javascript中使用您的视图模型,而不是在HTML中使用它。也就是说,您可以阅读自定义绑定()和带有
binding()的
。我同意最简单的方法是对临时使用的变量进行$root调用,但它并不总是满足我的需要,我不想潜在地删除某些内容,我想使用knockout的功能来声明子上下文。如果我正在处理子上下文,$root会调用错误的视图模型。@Milimetric“With”绑定不是我所需要的,一旦你进入一个子上下文(例如foreach),With绑定就完全没有用了。@MykaEyl:好吧,那么答案的后半部分几乎满足了你的要求,不是吗?我个人建议不要在$root上下文中进行黑客攻击。这是一种“使其成为全局变量”的方法,当他们真的想要某种形式的范围界定时,更可能。同意,这里的主要收获是使用javascript处理视图模型,而不是在HTML中对其进行黑客攻击。也就是说,您可以阅读自定义绑定()和带有
binding()的
。我同意最简单的方法是对临时使用的变量进行$root调用,但它并不总是满足我的需要,我不想潜在地删除某些内容,我想使用knockout的功能来声明子上下文。如果我正在处理子上下文,$root会调用错误的视图模型。@Milimetric“With”绑定不是我所需要的,一旦你进入一个子上下文(例如foreach),With绑定就完全没有用了。@MykaEyl:好吧,那么答案的后半部分几乎满足了你的要求,不是吗?我个人建议不要在$root上下文中进行黑客攻击。这是一种“使其成为一个全局变量”的方法,当他们真的想要某种形式的范围界定时,更有可能。非常感谢Michael。这正是我需要的!非常感谢你,迈克尔。这正是我需要的!